Okay, so einfaches Problem hier. Ich arbeite an einem einfachen Sicherungscode. Es funktioniert einwandfrei, außer wenn die Dateien Leerzeichen enthalten. So finde ich Dateien und füge sie einem Teerarchiv hinzu:
find . -type f | xargs tar -czvf backup.tar.gz
Das Problem ist, wenn die Datei ein Leerzeichen im Namen enthält, weil tar denkt, dass es sich um einen Ordner handelt. Grundsätzlich gibt es eine Möglichkeit, Anführungszeichen um die Ergebnisse von find hinzuzufügen? Oder eine andere Möglichkeit, dies zu beheben?
find ... | xargs ...
ist die Verwendung des Parameters -print0 / -0 für jedes :find -print0 ... | xargs -0 ...
. Dies führt dazu, dass die Dateinamen durch ein Nullzeichen getrennt werden. Dies bedeutet, dass Ihre Dateinamen Leerzeichen oder Zeilenumbrüche oder andere seltsame Elemente enthalten können und dies weiterhin funktioniert.Antworten:
Benutze das:
Es wird:
tar -c
beixargs
, wenn Sie eine große Anzahl von Dateien habenSiehe auch:
quelle
-print0
gilt das nur für den letzten Ausdruck. ZBfind . \( -type f -o -name '*.c' \) -print0 | ...
c:\cygwin\bin\find . -regextype posix-egrep -regex '.*(sln^|vcxproj^|filters)$' -print0 | c:\cygwin\bin\tar -cvf MS_Projects.tar --null -T -
-T
und es bedeutet, die Dateinamen von der Standardeingabe zu lesen: Wenn Sie einen einzelnen Bindestrich als Dateinamen für "--files-from" angeben (dh Sie geben entweder --files-from = an - oder -T -), dann werden die Dateinamen von der Standardeingabe gelesenEs könnte einen anderen Weg geben, um das zu erreichen, was Sie wollen. Grundsätzlich,
Dann tar mit der Option -T, mit der eine Liste der Dateispeicherorte erstellt werden kann (die, die Sie gerade mit find erstellt haben!).
quelle
Versuchen Sie zu laufen:
quelle
Warum nicht:
Sicher, es ist klug, find und dann xargs zu verwenden, aber du machst es auf die harte Tour.
Update: Porges hat mit einer Suchoption kommentiert, die meiner Meinung nach eine bessere Antwort ist als meine oder die andere:
find -print0 ... | xargs -0 ....
quelle
xargs ... tar c ...
überschreibt das erste erstellte Archiv, wenn die Liste der Dateien zu lang ist, undxargs
wirdtar
zum zweiten Mal ausgeführt! Um ein Überschreiben zu vermeiden, können Sie verwenden,xargs -x
aber dann könnte das Archiv unvollständig sein. Alternative könnte sein, zuersttar c ...
und dann möglicherweise wiederholttar r ...
. (mein Beitrag zur Zuverlässigkeit :)Wenn Sie mehrere Dateien oder Verzeichnisse haben und diese in eine unabhängige
*.gz
Datei komprimieren möchten, können Sie dies tun. Optional-type f -atime
Dies wird komprimiert
zu
quelle
Probieren Sie so etwas aus:
tar cvf scala.tar `find src -name *.scala`
quelle
Eine andere Lösung wie hier zu sehen :
quelle
Würde @Steve Kehlet einen Kommentar hinzufügen , benötige aber 50 Wiederholungen (RIP).
Für alle, die diesen Beitrag durch zahlreiche Google-Vorgänge gefunden haben, habe ich eine Möglichkeit gefunden, nicht nur bestimmte Dateien in einem bestimmten Zeitraum zu finden, sondern auch NICHT die relativen Pfade ODER Leerzeichen einzuschließen, die Teerfehler verursachen würden. (Vielen Dank, Steve.)
.
relatives Verzeichnis-name "*.pdf"
Suchen Sie nach PDFs (oder einem beliebigen Dateityp).-type f
Der zu suchende Typ ist eine Datei-mtime 0
Suchen Sie nach Dateien, die in den letzten 24 Stunden erstellt wurden-printf "%f\0"
Normal-print0
ODER-printf "%f"
hat bei mir NICHT funktioniert. Aus Manpages:-czvf
Archiv erstellen, Archiv durch gzip filtern, verarbeitete Dateien ausführlich auflisten, ArchivnameEdit 2019-08-14: Ich möchte hinzufügen, dass ich auch im Wesentlichen den gleichen Befehl in meinem Kommentar verwenden konnte, nur mit tar selbst:
Wird benötigt,
--ignore-failed-read
falls es für heute keine neuen PDFs gab.quelle
Die beste Lösung scheint darin zu bestehen, eine Dateiliste zu erstellen und dann Dateien zu archivieren, da Sie andere Quellen verwenden und mit der Liste etwas anderes tun können.
Dies ermöglicht beispielsweise die Verwendung der Liste zur Berechnung der Größe der zu archivierenden Dateien:
quelle