Archiwizacja tar, która pobiera dane wejściowe z listy plików

166

Mam plik zawierający listę plików, które chcę zarchiwizować za pomocą tar. Nazwijmy tomylist.txt

Zawiera:

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

Czy istnieje sposób, w jaki mogę wydać polecenie TAR, które przyjmuje mylist.txtjako dane wejściowe? Coś jak

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

Żeby było podobnie jakbym wydał to polecenie:

tar -cvf allfiles.tar file1.txt file2.txt file10.txt 
neversaint
źródło
4
Strona podręcznika tar jest wyjątkowo nieprzydatna dla tej opcji (przynajmniej w RedHat od 5.4 do 6.3): "-T: pobierz nazwy do wyodrębnienia lub utworzenia z pliku F". „Wyodrębnij lub utwórz” brzmi tak, jakby dotyczyło pobierania plików z archiwum tar, ale ich nie umieszczania. Opcja -Xwykluczenia przetrwała ze starego polecenia tar systemu Unix, ale najwyraźniej -I (dołącz) nie!
Ogre Psalm 33
Istnieje kilka manstron z EXAMPLESsekcją, mimo że jest to sekcja standardowa . Zobacz < unix.stackexchange.com/questions/306189/… >.
sam boosalis

Odpowiedzi:

262

Tak:

tar -cvf allfiles.tar -T mylist.txt
Martin York
źródło
Chciałbym móc umieszczać komentarze w mylist.txt .. czy jest jakieś obejście przy użyciu opcji tar z wnętrza mylist.txt?
Stphane
7
@Stphane to proste, użycie flagi --exclude pozwala na to. Zakładając, że linie komentarza zaczynają się od '#', polecenie takie jak poniższe zignorowałoby / wykluczyło wszelkie próby operacji na plikach na wierszach zawierających cmmenty, tj. Twoje polecenie może wyglądać następująco: tar -cvf allfiles.tar --exclude = '^ # '-T mylist.txt. Tar zgłasza błąd, ale kiedy sprawdzasz archiwum tar, nie ma błędów, a wszystkie pliki z listy znajdują się w twoim archiwum.
Matt G
Zwracając uwagę, że to polecenie jest dla wersji linux, a dla tych na sunOS lub innych wariantach, sprawdź inne odpowiedzi poniżej. Np. Dla sunOS, przetestowałem dwie alternatywy: tar -cvf plik.tar -I list.txt i tar -cvf plik.tar $ (cat list.txt)
Nasri Najib
-L mylist.txtw systemie AIX
Roland
82

Zakładając GNU tar (jak to jest Linux), opcja -Tlub --files-fromjest tym, czego chcesz.

Simon Richter
źródło
3
Ta opcja istnieje również w "bsdtar 3.1.2" na FreeBSD 10.
drue
33

Możesz również potokować nazwy plików, które mogą być przydatne:

find /path/to/files -name \*.txt | tar -cvf allfiles.tar -T -
woot
źródło
2
A co, jeśli lista plików .txt jest naprawdę ogromna? Czy należy używać polecenia xarg z tar -r .. zamiast tar -c ..?
Stphane
1
@Stphane Hmm, nie sądzę, żeby długość listy miała duże znaczenie dla tej metody. W rzeczywistości wyobrażam sobie, że ta metoda jest lepsza niż xargs, ponieważ xargs będzie ponownie uruchamiać tar w celu dodania danych, ale tak naprawdę nie testowałem metod obok siebie.
woot
2
W przypadku zastosowania potoku, co ma miejsce w tym przypadku, system operacyjny tworzy strumienie po obu stronach rury i synchronizuje wytwarzanie i zużycie danych. Lista plików może być nieskończona. Możesz tarować / gz cały Internet za pomocą Raspberry Pi Zero, biorąc pod uwagę, że masz wystarczająco dużo miejsca na końcu potoku.
Richard Gomes
14

Niektóre wersje tar, na przykład domyślne wersje na HP-UX (testowałem 11.11 i 11.31), nie zawierają opcji wiersza poleceń do określenia listy plików, więc dobrym obejściem jest zrobienie tego:

tar cvf allfiles.tar $(cat mylist.txt)
barush
źródło
4
UUoC (niepotrzebne użycie cat), po prostu $(<mylist.txt).
David C. Rankin,
2
zauważ, że może to przekroczyć maksymalną długość wiersza poleceń, jeśli mylist.txtjest duży
Andre Holzner,
w takim przypadku tar -T <(<mylist.txt). zbędne, jak ta odpowiedź.
Mike D
7

W systemie Solaris można użyć opcji -I, aby odczytać nazwy plików, które normalnie podaje się w wierszu poleceń z pliku. W przeciwieństwie do wiersza poleceń, może to tworzyć archiwa tar z setkami tysięcy plików (właśnie to zrobiłem).

Więc przykład brzmiałby

tar -cvf allfiles.tar -I mylist.txt
Jan
źródło
3

U mnie w systemie AIX działało w następujący sposób:

tar -L List.txt -cvf BKP.tar
Cassiano Bucci
źródło