Я использовал ответы из Копировать файлы, не теряя права доступа к файлам / папкам , когда наткнулся на это интересное и неожиданное поведение.
Использование 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 должна работать одинаково с -
или без него.
Надеюсь, это поможет кому-то еще, кто, как и я, добавил -
, думая, что это просто стилистическая разница, которая не изменит команду.
Так как мне любопытно, и я хотел бы узнать больше об этом, может кто-нибудь пролить свет на то, почему это происходит?
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!
-f
опция должна сопровождаться именем файла или именем устройства. При использовании tar cvpfz target.tar.gz dir1
Вы на самом деле используете так называемый "Старый Стиль Опции", где
, Когда опции, для которых нужны аргументы, даны вместе с командой, все связанные аргументы следуют в том же порядке как опции. (страница информации о tar)