Ich versuche zu lernen, wie man bash
Skripte verwendet. Ich habe gegoogelt, kann aber keine Antwort auf mein Problem finden.
Das Skript sieht folgendermaßen aus:
#!/bin/bash
TIME=`date +%b-%d-%y`
FILENAME=backup-$TIME.tar.gz
DESDIR=home/pi/backups
SRC=home/pi/backuplist.txt
find -iname '*.orig' -o -iname '*.py' > home/pi/backuplist.txt
tar -zcvf $DESDIR/$FILENAME $SRC
wenn ich dies ausführe, wird es nicht erstellt, backuplist.txt
sodass kein Ergebnis vorhanden ist, das verwendet werden kann tar
.
ich habe versucht, es find -iname
direkt tar
in einer Pipeline zu verwenden, habe aber nur die Antwort erhalten -iname command does not exist
.
Wenn ich find
die Ausgabe zuerst im Terminal verwende und sie dann verwende, tar
funktioniert es.
Was mache ich falsch?
Antwort1
Dieses Skript weist zwei Hauptprobleme auf:
Die Pfade sind relativ. Das bedeutet, dass beim Ausführen davon ausgegangen wird, dass
home/pi
imAktuelles Verzeichnis. Ich habe das Gefühl, dass alle Vorkommen vonhome/pi
im Skript in geändert werden sollten/home/pi
.Der
tar
Befehl ist wahrscheinlich dazu gedacht, die Dateien in der Datei zu sichernbackuplist.txt
. So wie er jetzt geschrieben ist, erhalten Sie eintar
Archiv, das diebackuplist.txt
Datei selbst und sonst nichts enthält. Wenn Sie dieInhaltdieser Datei verwendentar -zcvf "$DESDIR/$FILENAME" -T "$SRC"
.Das Skript enthält auch Variablen ohne Anführungszeichen.
Ich denke, Sie möchten Folgendes:
#!/bin/bash
TIME="$(date +%b-%d-%y)"
FILENAME="backup-$TIME.tar.gz"
DESDIR="/home/pi/backups"
SRC="/home/pi/backuplist.txt"
find /home/pi -iname '*.orig' -o -iname '*.py' >"$SRC"
tar -zcvf "$DESDIR/$FILENAME" -T "$SRC"
Das /home/pi
in der find
Befehlszeile ist eine wilde Vermutung. Ohne sie gehe ich davon aus, dass GNU find
das aktuelle Verzeichnis verwenden würde.
Antwort2
Ich denke, dass dieses leicht abgeänderte Skript Ihrem ursprünglichen Wunsch gerecht wird, die Liste der Dateien direkt in zu leiten tar
.
Ich habe Variablen dort in Anführungszeichen gesetzt, wo sie verwendet werden, und Backticks `...`
durch die moderne $(...)
Konstruktion ersetzt.
Schließlich bin ich davon ausgegangen, dass Sie dies von aus ausführen möchten /
, damit die von Ihnen verwendeten Pfade existieren können.
#!/bin/bash
WHEN=$(date +%b-%d-%y)
FILENAME="backup-$WHEN.tar.gz"
DESDIR=/home/pi/backups
SRC=/home/pi/backuplist.txt
mkdir -p "$DESDIR"
cd /
find -iname '*.orig' -o -iname '*.py' |
tee "$SRC" |
tar zcvf "$DESDIR/$FILENAME" --no-recursion --verbatim-files-from --files-from -
Sie können die beiden Referenzzeilen vollständig weglassen, $SRC
wenn Sie die Dateiliste während des Sicherungsvorgangs nicht erstellen müssen.