Ich habe eine Liste von Verzeichnissen. Einige der Verzeichnisse müssen rekursiv tariert werden, andere erfordern nur die in diesem Verzeichnis vorhandenen Dateien, keine Unterverzeichnisse: Wie würde mein Tar-Befehl am Beispiel des folgenden Verzeichnisses/der folgenden Dateien aussehen:
/tmp/dir1/ - Recursively
/tmp/dir2/ - Only the files that exist in that directory, no subdirectories
/tmp/dir3/file1 - Only this single file.
Antwort1
Folgendes ist dabei herausgekommen:
Zunächst die Verzeichnisstruktur, die ich als Beispiel verwende:
$ find dir1 dir2 dir3 -print
dir1
dir1/file1
dir1/file2
dir1/sub_dir1
dir1/sub_dir1/file1
dir2
dir2/file1
dir2/file2
dir2/sub_dir1
dir2/sub_dir1/file1
dir3
dir3/file1
$
Als nächstes meine Lösung, die aus drei Befehlen besteht:
Erster Befehl:
tar cvf archive.tar dir1
Ziemlich normal. Lassen Sie es uns aufschlüsseln:
c
- Erstellenv
- Ausführlich (mal sehen, was los ist)f
- der gewünschte Dateiname, in unserem Fallarchive.tar
archive.tar
- das eigentliche Argument für unserenf
Schalterdir1
- was wir eigentlich teeren wollen
Zweiter Befehl:
find dir2 -maxdepth 1 -type f -print0 | xargs -0 tar rvf archive.tar
Lassen Sie es uns aufschlüsseln:
find dir2
- Wo wir suchen möchten.-maxdepth 1
- Gehen Sie nicht tiefer als bis zu einer Tiefe von 1 (bleiben Sie an der Wurzel vondir2
).-type f
- Suche nach Dateien-print0
- Drucken Sie am Ende kein Zeilenumbruchzeichen aus, sondern verwenden Sie stattdessen ein Nullzeichen. Dies hilft uns, wenn find Dateien mit Leerzeichen findet.| xargs -0
- Die Standardeingabe, die wir mit dem Befehl find gefunden haben, wird hier ausgegeben, um ausgeführt zu werden, unter Berücksichtigung unsererprint0
tar rvf
- Der einzige neue Schalter hier istr
. Dies ist unsere Anhängeoption. Sie fügtarchive.tar
am Ende unser hinzu. Nicht zu verwechseln mit derA
Option, die speziell für das Anhängen zusätzlicher Archive gilt (.tar
-s).archive.tar
- Der Teer, an den wir anhängen möchten.Am Ende dieses Befehls wird unser Standardeingang verwendet. zB
archive.tar <stdinput>
Dritter Befehl:
tar rvf archive.tar dir3/file1
archive.tar
An eine einzelne Datei anhängen ( file1
) von dir3
.
Und schließlich, wie das Tar nach seiner Erstellung aussieht. Die t
Option wird verwendet, um seinen Inhalt auszudrucken.
$ tar tvf archive.tar
drwxrwxr-x mmallard/mmallard 0 2019-07-18 16:02 dir1/
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:01 dir1/file1
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:01 dir1/file2
drwxrwxr-x mmallard/mmallard 0 2019-07-18 16:02 dir1/sub_dir1/
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:02 dir1/sub_dir1/file1
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:02 dir2/file1
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:02 dir2/file2
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:02 dir3/file1
$