Mam duży plik, foo.tar.xz
który zawiera dużo (powiedzmy 200000) plików. Doszedłem do wniosku, że to archiwum zawiera niektóre (około 5000) plików, których nie chcę. Nie mam wystarczającej ilości miejsca na dysku, aby zdekompresować całą zawartość na dysk; dodatkowo obawiam się, że atrybuty / prawa mogą zostać utracone, jeśli to zrobię. Mam jednak wystarczająco dużo miejsca, aby pomieścić dwie kopie skompresowanego archiwum. Czy istnieje narzędzie do usuwania niektórych plików z archiwum (określonych za pomocą wyrażenia regularnego w nazwie pliku) w locie, tj. Bez rozpakowywania archiwum do poszczególnych plików?
17
gtar --delete
.-T
współpracuje z--delete
, i--wildcards
pozwala na używanie wzorców zamiast nazw plików, więc utwórz plik tymczasowy zawierający wzorce i użyjunxz < file.tar.xz | tar --wildcards --delete -T patternfile | xz > file2.tar.xz
. Nie wykona pełnego wyrażenia regularnego (jeśli potrzebujesz, po prostu użyjtar -t
i stwórz listę nazw plików do usunięcia), po prostu wzorce dopasowania nazw plików.(zredagowane, ponieważ źle zrozumiałem pytanie, które od tego czasu było również edytowane)
Najlepsze, co możesz zrobić, to wyodrębnić, usunąć i ponownie skompresować cały plik.
unxz < foobar-old.tar.xz | tar --delete foo/bar | xz > foobar-new.tar.xz
Nie można bezpośrednio usunąć plików z tar.
tar jest strumieniem, pierwotnie przeznaczonym dla napędów taśmowych, które nie szukają losowo - podczas gdy w systemie plików dyskowych możliwe jest wybicie dziury / przepisanie pozostałego pliku, przy kompresji punkt jest sporny, jak większość, jeśli nie wszystkie metody kompresji silnie zależą od zawartości, która pojawiła się wcześniej w pliku. Aby to zrobić, potrzebujesz bardzo szczegółowej wiedzy zarówno na temat metody kompresji, jak i formatu pliku tar. To złożoność do tego stopnia, że nikt nawet nie zawracałby sobie tym głowy. Tańsze jest po prostu przechowywać pliki i ignorować je.
Jeśli potrzebujesz tej funkcji, tar prawdopodobnie nie jest tym, czego chcesz.
źródło
--wildcards
pomoc ... Musiałem jednak uwzględnić./
na początku wzoru ...Zgodnie z instrukcją można przekazać listę nazw plików,
tar
aby tylko je wyodrębnić. Na przykład:źródło