Tar-Archivierung, die Eingaben aus einer Liste von Dateien übernimmt

165

Ich habe eine Datei mit einer Liste von Dateien, die ich mit tar archivieren möchte. Nennen wir esmylist.txt

Es beinhaltet:

file1.txt
file2.txt
...
file10.txt

Gibt es eine Möglichkeit, einen TAR-Befehl auszugeben, der mylist.txtals Eingabe verwendet wird? Etwas wie

tar -cvf allfiles.tar -[someoption?] mylist.txt

Damit es ähnlich ist, als würde ich diesen Befehl ausgeben:

tar -cvf allfiles.tar file1.txt file2.txt file10.txt 
neversaint
quelle
4
Die Tar-Manpage ist für diese Option äußerst wenig hilfreich (zumindest unter RedHat 5.4 bis 6.3): "-T: Namen zum Extrahieren oder Erstellen aus Datei F abrufen". "Extrahieren oder erstellen" klingt so, als würde es gelten, Dateien aus dem Tar-Archiv zu entfernen, aber nicht einzulegen. Die -XAusschlussoption bleibt vom alten Unix-Tar-Befehl erhalten, aber anscheinend hat -I (include) dies nicht getan!
Oger Psalm33
Es gibt nur wenige manSeiten mit einem EXAMPLESAbschnitt, obwohl es sich um einen Standardabschnitt handelt . Siehe < unix.stackexchange.com/questions/306189/… >.
Sam Boosalis

Antworten:

261

Ja:

tar -cvf allfiles.tar -T mylist.txt
Martin York
quelle
Ich wünschte, ich könnte Kommentare in mylist.txt einfügen. Gibt es eine Problemumgehung mit einer tar-Option in mylist.txt?
Stphane
7
@Stphane, das ist einfach. Die Verwendung des Flags --exclude ermöglicht dies. Angenommen, Ihre Kommentarzeilen beginnen mit einem '#', würde ein Befehl wie der folgende alle versuchten Dateivorgänge in Zeilen mit cmments ignorieren / ausschließen, dh Ihr Befehl kann folgendermaßen aussehen: tar -cvf allfiles.tar --exclude = '^ # '-T mylist.txt. Tar meldet einen Fehler, aber wenn Sie Ihr Tar-Archiv überprüfen, treten keine Fehler auf, und alle Dateien aus der Liste befinden sich in Ihrem Archiv.
Matt G
Wenn Sie darauf hinweisen, dass dieser Befehl für Linux-Varianten und für SunOS-Versionen oder andere Varianten gilt, lesen Sie die folgenden Antworten. ZB für sunOS habe ich zwei Alternativen getestet: tar -cvf file.tar -I list.txt und tar -cvf file.tar $ (cat list.txt)
Nasri Najib
-L mylist.txtauf AIX
Roland
82

Angenommen, GNU tar (da dies Linux ist), ist die Option -Toder --files-fromgenau das, was Sie wollen.

Simon Richter
quelle
3
Diese Option gibt es auch in "bsdtar 3.1.2" unter FreeBSD 10.
23.
33

Sie können auch die Dateinamen eingeben, die nützlich sein könnten:

find /path/to/files -name \*.txt | tar -cvf allfiles.tar -T -
woot
quelle
2
Was ist, wenn die Liste der TXT-Dateien wirklich riesig ist? Sollte man den Befehl xarg mit tar -r .. anstelle von tar -c .. verwenden?
Stphane
1
@Stphane Hmm, ich denke nicht, dass die Länge der Liste für diese Methode wichtig ist. Tatsächlich würde ich mir vorstellen, dass diese Methode besser ist als xargs, da xargs tar immer wieder ausführt, um Daten anzuhängen, aber ich habe die Methoden nicht wirklich nebeneinander getestet.
woot
2
Wenn eine Pipe verwendet wird, was hier der Fall ist, erstellt das Betriebssystem Streams auf beiden Seiten der Pipe und synchronisiert die Produktion und den Verbrauch von Daten. Die Liste der Dateien kann unendlich sein. Sie können das gesamte Internet mit einem Raspberry Pi Zero tar / gz, vorausgesetzt, Sie haben genügend Speicherplatz am Ende der Pipe.
Richard Gomes
14

Einige Versionen von tar, z. B. die Standardversionen unter HP-UX (ich habe 11.11 und 11.31 getestet), enthalten keine Befehlszeilenoption zum Angeben einer Dateiliste. Daher sollten Sie Folgendes umgehen:

tar cvf allfiles.tar $(cat mylist.txt)
Barush
quelle
4
UUoC (unnötige Verwendung von cat), einfach $(<mylist.txt).
David C. Rankin
2
Beachten Sie, dass dies die maximale Länge der Befehlszeile überschreiten kann, wenn sie mylist.txtgroß ist
Andre Holzner
in diesem Fall tar -T <(<mylist.txt). überflüssig wie diese Antwort.
Mike D
7

Unter Solaris können Sie die Option -I verwenden, um die Dateinamen, die Sie normalerweise in der Befehlszeile angeben, aus einer Datei zu lesen. Im Gegensatz zur Befehlszeile können hierdurch Tar-Archive mit Hunderttausenden von Dateien erstellt werden (haben Sie das gerade getan).

Das Beispiel würde also lauten

tar -cvf allfiles.tar -I mylist.txt
Jan.
quelle
3

Für mich unter AIX hat es wie folgt funktioniert:

tar -L List.txt -cvf BKP.tar
Cassiano Bucci
quelle