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 

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

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.


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 -

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)

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.