Команда zip не работает

Я пытаюсь заархивировать файл с помощью команды сценария оболочки. Я использую следующую команду:

  zip ./test/step1.zip $FILES

где $FILES содержит все входные файлы. Но я получаю предупреждение следующим образом

    zip warning: name not matched: myfile.dat

и еще одна вещь, которую я заметил, что у файла, который наконец находится в списке файлов в папке, есть вышеупомянутое предупреждение, и этот файл не получает сжатый.

Может кто-нибудь объяснить мне, почему это происходит? Я новичок в мире сценариев оболочки.

6 ответов

zip предупреждение: имя не совпадает: myfile.dat

Это означает, что файл myfile.dat не существует.

Вы получите ту же ошибку, если файл является символической ссылкой, указывающей на несуществующий файл.

Как вы говорите, каким бы ни был последний файл на $FILES, он не будет добавлен в почтовый индекс вместе с предупреждением. Поэтому я думаю, что что-то не так с тем, как вы создаете $FILES, Скорее всего, в конце последнего имени файла есть символ новой строки, возврата каретки, пробела, табуляции или другого невидимого символа, в результате чего чего-то не существует. Попробуйте это например:

for f in $FILES; do echo :$f:; done

Бьюсь об заклад, последняя строка будет неправильной, например:

:myfile.dat :

... или что-то подобное вместо :myfile.dat: без символов до последнего :

ОБНОВИТЬ

Если вы говорите, что скрипт начал работать после запуска dos2unix на это, что подтверждает то, что все уже подозревали, что каким-то образом был возврат каретки в конце вашего $FILES список.

od -c показывает возврат каретки. Пытаться echo $FILES | od -c

Другая возможная причина, которая может генерировать zip warning: name not matched: ошибка имеет какой-либо из zipПеременные среды установлены неправильно.

Со страницы руководства:

ENVIRONMENT
    The following environment variables are read and used by zip as described.

ZIPOPT
    contains default options that will be used when running zip.  The contents of this environment variable will get added to the command line just after the zip command.

ZIP
    [Not on RISC OS and VMS] see ZIPOPT

Zip$Options
    [RISC OS] see ZIPOPT

Zip$Exts
    [RISC OS] contains extensions separated by a : that will cause native filenames with one of the specified extensions to be added to the zip file with basename and extension swapped.

ZIP_OPTS
    [VMS] see ZIPOPT

В моем случае я использовал zip в скрипте и имел двоичное расположение в переменной окружения ZIP чтобы мы могли перейти на другой zip двоичный файл легко, не внося тонны изменений в сценарии.

Пример:

ZIP=/usr/bin/zip
...
${ZIP} -r folder.zip folder

Затем это обрабатывается как:

/usr/bin/zip /usr/bin/zip -r folder.zip folder

И генерирует ошибки:

zip warning: name not matched: folder.zip
zip I/O error: Operation not permitted
zip error: Could not create output file (/usr/bin/zip.zip)

Первый, потому что сейчас пытается добавить folder.zip в архив, а не использовать его в качестве архива. Второй и третий, потому что он пытается использовать файл /usr/bin/zip.zip как архив, который (к счастью) не доступен для записи обычному пользователю.

Примечание. Это действительно старый вопрос, но я нигде не нашел этого ответа, поэтому я публикую его, чтобы помочь будущим поисковикам (включая мое будущее).

eebbesen ударил по гвоздю в своем комментарии к моему делу (но я не могу голосовать за комментарий). Другая возможная причина, пропущенная в других комментариях, - файл, превышающий ограничение размера файла (4 ГБ).

Я преобразовал свой сценарий для среды Unix с помощью команды dos2unix и выполнил мой сценарий как./myscript.sh вместо bash myscript.sh.

Я тоже столкнулся с этой проблемой. В моем случае отдельная строка - это CRLF в моем сценарии оболочки zip, что вызывает проблему. Использование LF исправило это.

Пробелы не допускаются:

он потерпит неудачу, если в $FILES будет несколько файлов, если вы не поместите их в цикл

Я только что обнаружил другую потенциальную причину для этого. Если разрешения каталога / подкаталога не позволяют zip-файлу найти файл, он сообщит об этой ошибке. На самом деле, если вы запустите chmod -R 444 в каталоге, а затем попытаетесь сжать его, вы воспроизведете эту ошибку, а также получите отчет "сохранено 0%", например:

zip предупреждение: имя не соответствует: добавление borrar / enviar: borrar/ (сохранено 0%)

Следовательно, попробуйте изменить права доступа к файлу. Если вы пытаетесь отправить их по электронной почте, и эти почтовые фильтры (например, Gmail) изобретают глупые фильтры отсутствия отправки исполняемых файлов, не забывайте, что очень строгие разрешения при сжатии zip могут быть причиной сообщаемой вами ошибки, "имя не соответствует".

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