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

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

  zip ./test/step1.zip $FILES

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

    zip warning: name not matched: myfile.dat

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

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


person Aparna Savant    schedule 11.12.2013    source источник
comment
Можете ли вы предоставить ls -ltr для myfile.dat? Я слышал о некоторых проблемах со слишком большими файлами и/или символическими ссылками.   -  person eebbesen    schedule 12.12.2013


Ответы (7)


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

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

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

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

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

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

:myfile.dat :

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

ОБНОВЛЕНИЕ

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

od -c показывает возврат каретки \r. Попробуйте echo $FILES | od -c

person janos    schedule 11.12.2013
comment
Но мне не терпится увидеть этот файл в указанной папке - person Aparna Savant; 12.12.2013
comment
Как я уже сказал, последний файл в списке имеет эту ошибку. Если я попытаюсь заархивировать файл type.txt вместе с файлом $FILES, тогда type.txt получит это предупреждение и не будет включен в zip! - person Aparna Savant; 12.12.2013
comment
Тогда нам нужны подробности. Что находится в $FILES? Показать ls по запросу. У меня работает следующее: $ mkdir ziptest $ cd ziptest $ touch a b c $ mkdir d $ touch d/e $ zip foo.zip a b c d/e adding: a (stored 0%) adding: b (stored 0%) adding: c (stored 0%) adding: d/e (stored 0%) - person Sean Perry; 12.12.2013
comment
Как создать $FILES? - person janos; 12.12.2013
comment
Готов поспорить, что в конце вашего списка $FILES есть возврат каретки. - person Donovan; 12.12.2013

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

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

person Dave Wood    schedule 03.04.2017

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

person chukko    schedule 07.04.2015

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

person Aparna Savant    schedule 11.12.2013
comment
И ./myscript.sh, и bash myscript.sh должны работать. Если вы говорите, что скрипт начал работать после запуска на нем dos2unix, это подтверждает то, что все уже подозревали, что каким-то образом в конце вашего списка $FILES был возврат каретки. - person janos; 12.12.2013
comment
@janos Вы правы, был возврат каретки. Но проблема все еще возникает, если я запускаю скрипт с помощью «bash myscript.sh». Но с ./myscript.sh мой скрипт работает отлично! - person Aparna Savant; 12.12.2013

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

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

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

person David L    schedule 29.09.2014

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

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

person Mr.T    schedule 18.04.2014

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

person Sean    schedule 11.04.2020