tar завершает работу в «Cannot stat: нет такого файла каталога», почему?

50

Я пытаюсь создать файл tar.gz с помощью следующей команды:

sudo tar -vcfz dvr_rdk_v1.tar.gz dvr_rdk/

Затем он начинает создавать файлы (много файлов в папке), но затем я получаю следующую ошибку:

tar: dvr_rdk_v1.tar.gz: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

Я не вижу описания этой ошибки, что это значит?

ransh
источник

Ответы:

61

Удалить -из vcfzвариантов. tarне нужен дефис для опций.

Аргументом для -fопции является дефис z. Таким образом, команда пытается выполнить архивирование dvr_rdk_v1.tar.gzи вызывается в dvr_rdkархиве z. Без дефиса семантика параметров изменяется, так что следующий аргумент в командной строке, то есть имя файла вашего архива, становится аргументом для fфлага.

Также проверьте разрешение на запись в каталог, из которого вы выполняете команду.

Velnix
источник
6
Это не нуждается в дефисах, но они не должны быть проблемой, они просто необязательны
Майкл Мрозек
18
@MichaelMrozek На самом деле удаление -действительно имеет значение, потому что GNU tar - это странно. Аргументы опции не могут быть связаны с первым аргументом, когда он не начинается с a -, поэтому аргумент to fявляется следующим аргументом tar, и, следовательно tar vcfz dvr_rdk_v1.tar.gz, эквивалентен tar -v -c -f dvr_rdk_v1.tar.gz -z.
Жиль "ТАК - перестань быть злым"
1
Я также понял, удастся ли мне удалить zили jсжатие архива будет успешным даже при -включенном. Когда я добавляю дефис, он включается, он обрабатывает последний символ в опции как «файл». В результате я получаю jили zв виде архивного файла, если я использую эту опцию -cvfzили -cvfj.
JohnnyQ
9
Сводка: если «f» встречается как опция, отличная от последней, команда не будет выполнять то, что предполагалось. Я не понимаю, как Gnu не может добавить предупреждение, когда обнаруживает такую ​​серьезную и легко обнаруживаемую проблему. Я просто потратил 40 минут на отладку этой странности. Этот, должно быть, потратил сотни тысяч человеко-часов производительности.
SMCI
58

-fПараметр должен непосредственно предшествовать имя файла. Итак, используйте tar -vczf filename.tar.gzвместо-vcfz

twan163
источник
Ах, это объясняет, почему команда, которую я использую, пытается создать сжатый архивный файл, который вызывается jили zс этими командами -cvfjи -cvfzсоответственно.
JohnnyQ
17

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

Страница стандартов для tar говорит:

f
Используйте первый файловый операнд (или второй, если b уже указан) в качестве имени архива вместо системно-зависимого значения по умолчанию

Хотя правила синтаксиса включают это:

Рекомендация 5.
Один или несколько параметров без аргументов-параметров, за которыми следует не более одного параметра, который принимает аргумент-параметр, должны приниматься при группировании за одним разделителем '-'.

Таким образом, хотя команда, которую вы ввели tar -vcfz dvr_rdk_v1.tar.gz dvr_rdk/, подойдет для более старых версий tar, некоторые версии tar, написанные для строгого следования рекомендациям по синтаксису утилиты, будут анализировать это как «использовать zв качестве аргумента файла для -f». Таким образом, вы должны использовать следующее для переносимости:

tar -cvzf dvr_rdk_v1.tar.gz dvr_rdk/
Марк Плотник
источник
-1

Создать архив

$ tar -cvf music.tar Music/

Это показывает список файлов и папок

$ tar -tvf music.tar         

И извлечь снова

$ tar -xvf music.tar         
Дхаму
источник
Это не совсем объясняет его ошибку, верно? Это просто объясняет использование tar.
Бернхард
1
@Bernhard Ну, его ошибка заключалась в том, что он использовал tarнеправильно, хотя приятно хотя бы упомянуть, в чем заключается ключевое отличие (переход -fк концу)
Майкл Мрозек
2
@MichaelMrozek Ну, он скорее пропустил, zчем поставил fв конце, отсюда мой комментарий.
Бернхард
Эта команда работает на Ubuntu, она будет успешной
dhamu
ХОРОШО! извините, я не слушаю ваш вопрос, но команда работает на Ubuntu.
Дхаму