Ich versuche, einen komprimierten Tarball zu erstellen, der alle PDF-Dateien enthält, die in einem meiner Verzeichnisse vorhanden sind. Die Verzeichnisstruktur muss beibehalten werden. Leere Verzeichnisse werden nicht benötigt, aber es ist mir wirklich egal, ob sie da sind.
Angenommen, ich hätte ein Verzeichnis, das so aussieht:
dir
dir/subdir1
dir/subdir1/subsubdir1/song.mp3
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir2/subsubdir1/another-song.mp3
dir/subdir2/subsubdir1/top-ten-movies.txt
dir/subdir3
dir/subdir3/another-document.pdf
Nach dem Ausführen des Befehls möchte ich Folgendes dir.tar.gz
enthalten:
dir
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir3
dir/subdir3/another-document.pdf
Möglich?
find docs \( -iname '*.pdf' -o -iname '*.mp3' \) -printf '"%p"\n' | xargs tar czf docs-media.tar.gz
\'"
(Fehler von xargs), und nicht funktioniert, wenn zu viele Dateinamen vorhanden sind (Fehler des Kernels).-printf '"%p"\n'
kümmert sich der Teil darum (zumindest für mich).Mit Bash ≥4 oder zsh und GNU tar:
Dies funktioniert möglicherweise nicht, wenn Sie eine sehr große Anzahl von PDF-Dateien haben und die Befehlszeile zu lang ist. Dann benötigen Sie eine komplexere findbasierte Lösung (ebenfalls mit GNU tar):
Alternativ (und portabel) können Sie das Archiv mit pax erstellen .
Der erste
-s
besagt, dass alle.pdf
Dateien eingeschlossen werden sollen, ohne ihren Namen zu ändern. Die zweite-s
besagt, dass alle anderen Dateien in einen leeren Namen umbenannt werden sollen, was eigentlich bedeutet, sie nicht in das Archiv aufzunehmen.quelle
**
; Ich wusste nicht einmal, dass Bash 4 das jetzt hatte