Ich versuche, eine Shell-Skripte zu schreiben, die jede Datei in einem Verzeichnis sichern wird. In oder bekommen die Dateien, die ich verwendenErsetzen '' mit '' in Bash
FILENAMES="$(find -maxdepth 1 -not -path './.*' -type f)"
, die alle etwas gibt die Namen der Dateien enthält.
Falls keine der Dateinamen Leerzeichen enthalten dann
tar --exclude='archive.tar.bz2' -cvpjf archive.tar.bz2 $FILENAMES
mit macht den Job und alles ist in Ordnung.
Wenn es jedoch einen Dateinamen "bad filename.txt" gibt, funktioniert der obige Ansatz nicht und tar wird sich beschweren, dass es "schlecht" von "filename.txt" nicht finden kann.
Ich habe versucht, dieses Problem zu beheben, indem einen Inline-Ersatz, wie here verwenden, aber das funktioniert nicht:
TOARCHIVE=${FILENAMES// /'\ '}
Im Grunde das, was tut, ist die Räume in der geeigneten Position zu ersetzen, wenn ich es echo
. Aber tar
scheint die eingefügte '\'
nicht zu sehen. Wenn Sie versuchen, den Ersatzcode mit zwei Schrägstrichen, wie '\\'
oder '\\ '
tar
wird beide Schrägstriche sehen und erneut beschweren.
Eine andere Lösung für ähnliche Probleme, die ich gesehen habe, war sicherzustellen, dass alles in Anführungszeichen steht, aber das funktioniert nicht für mich, da TOARCHIVE
die Namen mehrerer Dateien enthält.
Möglicherweise möchten Sie nul Separator https://www.gnu.org/software/tar/manual/html_node/nul.html verwenden - und Pass '-print0' zu finden. – ideasman42