Добавление параметра tar '-z' (gzip) в конце tar -cvpfz… не работает должным образом

Я использовал ответы из Копировать файлы, не теряя права доступа к файлам / папкам , когда наткнулся на это интересное и неожиданное поведение.

Использование tar cvpfz target.tar.gz dir1 работает отлично, и это в основном структура команд, перечисленных в предложенных ответах на вопрос, связанный выше.

Странно, однако, когда я добавил необязательный параметр - перед параметрами (т. Е. tar -cvpfz ..., думая, что это было просто стилистическое изменение), вот где следует странность.

$ tar -cvpfz target.tar.gz dir1
tar: target.tar.gz: Cannot stat: No such file or directory
...
tar: Exiting with failure status due to previous errors

Даже незнакомец, хотя tar -cvpfz ... выдает вышеупомянутую ошибку, команда на самом деле работает, но вместо создания файла gzip она создает файл tar с именем z (даже если все равно выдает ошибку ).

Если я сделаю tar -tvf z, он правильно перечислит содержимое tar. Если я делаю tar -ztvf z, он говорит, что это не gzipped.

В конце концов я обнаружил, что изменение команды на tar -zcvpf работает отлично. Каким-то образом установка параметра z вначале работает правильно, а установка последнего (т. Е. tar -cvpfz ...) - нет!

man tar, похоже, указывает на то, что - является необязательным, и можно подумать, что Команда tar должна работать одинаково с - или без него.

Надеюсь, это поможет кому-то еще, кто, как и я, добавил -, думая, что это просто стилистическая разница, которая не изменит команду.

Так как мне любопытно, и я хотел бы узнать больше об этом, может кто-нибудь пролить свет на то, почему это происходит?

4
задан 13 April 2017 в 15:24

2 ответа

Muru действительно ответил на вопрос со ссылками, которые он отправил, но из-за его поддержки, я перекопирую одну из его ссылок и резюмировать мои комментарии здесь, чтобы, надо надеяться, помочь видеть ответ.

Согласно этой ссылке StackExchange, f параметр для tar команда является несколько особенной, поскольку она требует аргумента (имя файла архива), который сразу следует f параметр, если Вы предшествуете своим параметрам с a - (например. tar -cf). Однако как ответ в ссылке упоминает, может быть более безопасно просто воздержаться -, так f параметр не рискует рассматривать любые параметры, которые можно поместить после f как имя файла.

Это было проблемой, с которой я столкнулся, как указано в моем вопросе, так как я пытался поместить z параметр прямо после f (например. tar -cvpfz) который заставил команду tar жадно 'использовать' z и рассматривайте его как аргумент имени файла архива f параметр, вместо того, чтобы рассматривать z как просто tar gzip параметр команды.

Короче говоря, путем исключения - (например, использование tar cvpfz ... вместо tar -cvpfz ..) проблемы, с которой я встретился, можно избежать. Теперь я знаю почему. Спасибо, muru!

1
ответ дан 14 April 2017 в 01:24
  • 1
    Да su для укоренения может действительно нанести ущерб при отъезде клавиатуры с корневой оболочкой открытой, они могут действительно испортить установку. Однако да sudo su может быть опасным, поскольку он оставляет корневую оболочку открытой. Однако, если Вы находитесь на многопользовательском компьютере, Вы можете su другому пользователю, который не отличается, чем вхождение в того пользователя. Однако не то, чтобы часто Вы хотите сделать это. – ianorlin 17 December 2016 в 19:04

-f опция должна сопровождаться именем файла или именем устройства. При использовании tar cvpfz target.tar.gz dir1 Вы на самом деле используете так называемый "Старый Стиль Опции", где

, Когда опции, для которых нужны аргументы, даны вместе с командой, все связанные аргументы следуют в том же порядке как опции. (страница информации о tar)

0
ответ дан 14 April 2017 в 01:24
  • 1
    Этот ответ является очень всесторонним и очень высококачественным. Спасибо:) – cheesits456 18 December 2016 в 09:37

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

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