Почему -z не может быть последним параметром командной строки, который будет использоваться с tar?

$ ls one.tar.gz
one.tar.gz
$ tar -xvfz one.tar.gz
tar: z: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now
$ tar -xvzf one.tar.gz
one
$ tar -xzvf one.tar.gz
one
$ tar -zxvf one.tar.gz
one
$

2 ответа

Решение

-f switch принимает аргумент (имя файла). Если z появляется после f тогда это берется как имя файла.

tar -xvfz one.tar.gz

такой же как

tar -xvf z one.tar.gz

Если вы сделали это:

tar -xvf -z one.tar.gz

затем -z было бы принято в качестве имени файла, и вы получили бы аналогичную ошибку.

Это, однако, сработало бы:

tar -xvz -f one.tar.gz

GNU tar Страница руководства гласит:

Первым аргументом tar должен быть один из параметров: Acdrtux, за которым следуют любые необязательные функции. Последними аргументами tar являются имена файлов или каталогов, которые должны быть заархивированы.

Обратите внимание, что если входные данные не поступают из стандартного ввода и не выводятся из стандартного вывода (если это необходимо), -f filename Опция и аргумент должны быть указаны. В то время как справочная страница подразумевает, что порядок является фиксированным, в действительности параметры могут быть в любом порядке. Даже этот странный работает (но он может не работать во всех версиях tar):

tar -v files_to_archive* -f xyz.tar.gz -cz

Для переносимости, вероятно, лучше придерживаться идиоматического порядка аргументов и даже оставить дефис:

tar czvf xyz.tar.gz files_to_archive*

z можно использовать последним:

tar -x -v -f foo.tar.gz  -z

Но, как утверждает @Dennis, флаг f принимает аргумент.

Другие вопросы по тегам