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

4197
Lazer
$ 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 $ 
7

2 ответа на вопрос

15
Dennis Williamson

-fПереключатель принимает аргумент (имя файла). Если 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 являются имена файлов или каталогов, которые должны быть заархивированы.

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

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

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

tar czvf xyz.tar.gz files_to_archive* 
z, являющийся последним, и f, берущий аргумент, не являются взаимоисключающими. 13 лет назад 0
Это правда, но я этого не говорил. Возможно, я должен был быть более явным и сказал «сразу после». Dennis Williamson 13 лет назад 0
Вы не сказали этого, но вы начали свое предложение с «потому что», что является подтверждением его вопроса, который утверждает, что z не может быть последним, тем самым косвенно подразумевая, что z не может быть последним. Во всяком случае, я педантичен. Если вы удалите «потому что», то ваш ответ улучшен IMO. 13 лет назад 0
Педантичный, да. Я взял вопрос, чтобы включить подразумеваемое «в этой последовательности». Большую часть времени с `tar` вы видите, что все коммутаторы соединены, а не разделены, как в вашем ответе. Нет причины, по которой человек не мог бы сделать это так, как вы показываете, но идиома состоит в том, чтобы сделать это так, как это показано в первых двух успешных примерах вопроса: ` Dennis Williamson 13 лет назад 0
6

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

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

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

Похожие вопросы