Utwórz plik tar.xz jednym poleceniem

159

Próbuję utworzyć .tar.xzskompresowane archiwum jednym poleceniem. Jaka jest specyficzna składnia tego?

Próbowałem tar cf - file | xz file.tar.xz, ale to nie działa.

George K.
źródło

Odpowiedzi:

241

Użyj -Jopcji kompresji dla xz. I pamiętaj o man tar:)

tar cfJ <archive.tar.xz> <files>

Edycja 2015-08-10:

Jeśli przekazujesz argumenty tar z myślnikami (np .: tar -cfw przeciwieństwie do tar cf), to -fopcja musi być ostatnia , ponieważ określa nazwę pliku (dzięki @ABB za wskazanie tego!). W takim przypadku polecenie wygląda następująco:

tar -cJf <archive.tar.xz> <files>

źródło
5
dodanie vdo polecenia przełączników ( tar -cJvf), aby były pełne, pokazuje pliki dodawane do archiwum.
Stuart Cardall
7
Biorąc pod uwagę, że kolejność jest ważna w przypadku myślnika, prawdopodobnie najlepiej jest założyć, że kolejność jest zawsze ważna i umieścić fostatnią, nawet bez myślnika.
mwfearnley
1
Czy można przekazać parametry xz, takie jak -e (--extended)? Najwyraźniej domyślnie nie będzie używać rozszerzonego.
chmike
3
tarw systemie macOS wydaje się obsługiwać, -Jale funkcja nie jest podana na stronie podręcznika. Musiałem to sprawdzić tutaj. Chociaż wspominają o XZ w sekcji o --options...
cbarrick
1
@chmike Użyj zmiennej środowiskowej XZ_OPT. Np. XZ_OPT = "- 9e -T0".
Dzenly
50

Przełącznik -Jdziała tylko w nowszych systemach. Uniwersalne polecenie to:

Aby utworzyć archiwum .tar.xz

tar cf - directory/ | xz -z - > directory.tar.xz

Wyjaśnienie

  1. tar cf - directoryczyta katalog / i zaczyna umieszczać go w formacie TAR. Wynik tej operacji jest generowany na standardowym wyjściu.

  2. | przesyła standardowe wyjście na wejście innego programu ...

  3. ... co tak się dzieje xz -z -. XZ jest skonfigurowany do kompresji ( -z) archiwum ze standardowego wejścia ( -).

  4. Przekierowujesz dane wyjściowe z xzdo tar.xzpliku.

Wojciech Adam Koszek
źródło
16
-fnie oznacza „z pliku” po przekazaniu do xz. Zamiast tego jest skrótem od --force(szczegóły w xz (1) ) i najlepiej go nie używać, chyba że jest to potrzebne.
Eliah Kagan
@EliahKagan Fixed. Dzięki.
Wojciech Adam Koszek
2
Aby użyć kompresji wielowątkowej, można użyć opcji -T0:tar cf - directory/ | xz -z -T0 - > directory.tar.xz
oidualc
Kolejną zaletą jest to, że możesz łatwo określić poziom kompresji lub dowolną inną opcję xz w wierszu poleceń. Na przykład, jeśli chcesz przyspieszyć kompresję i nie przejmujesz się zbytnio rozmiarem, którego możesz użyć -1 -T0lub -0 -T0jako opcjami, które zwykle dają mniejszy plik niż gzip w porównywalnym lub szybszym czasie, podczas gdy domyślny -6jest znacznie wolniejszy niż gzip.
fgwaller
38

Jeśli podoba ci się tryb rur, jest to najbardziej czyste rozwiązanie:

tar c some-dir | xz > some-dir.tar.xz

Nie jest konieczne umieszczanie tej fopcji, aby zajmować się plikami, a następnie użycie -do określenia, że ​​plik jest standardowym wejściem. Nie trzeba też określać -zopcji dla xz, ponieważ jest ona domyślna.

Działa z gzipi bzip2też:

tar c some-dir | gzip > some-dir.tar.gz

lub

tar c some-dir | bzip2 > some-dir.tar.bz2

Dekompresja jest również dość prosta:

xzcat tarball.tar.xz | tar x
bzcat tarball.tar.bz2 | tar x
zcat tarball.tar.gz | tar x

Jeśli masz tylko tararchiwum, możesz użyć cat:

cat archive.tar | tar x

Jeśli chcesz wyświetlić tylko pliki, użyj tar t.

Rafael van Horn
źródło
8

Korzystanie z opcji kompresji xz

Jeśli chcesz użyć opcji kompresji dla xzlub jeśli używasz tarw systemie MacOS, prawdopodobnie chcesz uniknąć tar -cJfskładni.

Zgodnie z man xztym sposobem na to jest:

tar cf - baz | xz -4e > baz.tar.xz

Bo podobał mi się format Wojciecha Adama Koszka , ale nie informacja:

  1. c tworzy nowe archiwum dla określonych plików.
  2. fczyta z katalogu (najlepiej umieścić to na sekundę, ponieważ -cf! = -fc)
  3. - wyjścia na standardowe wyjście
  4. | potokuje wyjście do następnego polecenia
  5. xz -4epołączenia xzz -4eopcją kompresji. (równe -4 --extreme)
  6. > baz.tar.xz kieruje tarowany i skompresowany plik do baz.tar.xz

gdzie -4ejest, użyj własnych opcji kompresji. Często używam -kdo --keeporyginalnego pliku i -9do naprawdę dużej kompresji. -zręcznie ustawić xzna zip, chociaż domyślnie jest to kompresowanie, jeśli nie jest to zalecane.

Aby zdekompresować i rozpakować

Aby powtórzyć Rafael van Horn , aby zdekompresować i rozpakować (patrz uwaga poniżej):

xz -dc baz.tar.xz | tar x

Uwaga: w przeciwieństwie do odpowiedzi Rafaela użyj xz -dczamiast catxz. Dokumenty zalecają to w przypadku, gdy używasz tego do pisania skryptów. Najlepiej mieć nawyk używania -dlub --decompresszamiast tego unxz. Jeśli jednak musisz, użycie tych poleceń z wiersza poleceń jest w porządku.

Connor
źródło
Czy jest jakiś szczególny powód, aby nie używać tar -cJfskładni w systemie MacOS? Po prostu ciekawy, ponieważ właśnie to robiłem i wydawało się, że działa.
Lo-Tan
2
@ Lo-Tan Działa, jeśli masz smołę. Kiedy go używałem, nie miałem odpowiedniej wersji tar, więc nie działał. Chciałem również użyć opcji kompresji dla xz, których nie możesz zrobić, jeśli używasz tar. Poza tym składnia potoków jest dla mnie łatwiejsza do zapamiętania, więc zwykle jej używam. Ale dla każdego z nich
Connor,
4

Spróbuj tego: tar -cf file.tar file-to-compress ; xz -z file.tar

Uwaga:

  1. tar.gz i tar.xz to nie to samo; xz zapewnia lepszą kompresję.
  2. Nie używaj potoku, | ponieważ powoduje to jednoczesne uruchamianie poleceń. Używanie ;lub &wykonywanie poleceń jedno po drugim.
Jhim Preston
źródło
+1 W RHEL 5.10 nie widzę Jopcji, ale to działa. Myślę, że potrzebujesz RHEL6.
Brian
2
Dlaczego nie dostosować poleceń do przesyłania danych wyjściowych z tar do xz?
mwfearnley
@mwfearnley Myślę, że uwaga ma na celu jedynie podkreślenie, że polecenia muszą być wykonywane sekwencyjnie. Ponieważ nazwa pliku jest używana w obu poleceniach, nie będą zapisywać ani odczytywać danych ze standardowego wyjścia lub wejścia. Jeśli używasz polecenia bez określania nazwy pliku, można je połączyć w łańcuch, na przykład tar -c file-to-compress | xz -z > file.tar.xz.
Jack Q
Użycie &nie spowoduje uruchomienia poleceń jedno po drugim. Zamiast tego uruchomi pierwszy jako proces w tle.
Luis Lavaire