Подтвердить что ты не робот

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

Я пытаюсь закрепить файл с помощью команды shell script. Я использую следующую команду:

  zip ./test/step1.zip $FILES

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

    zip warning: name not matched: myfile.dat

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

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

4b9b3361

Ответ 1

zip warning: имя не соответствует: myfile.dat

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

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

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

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

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

:myfile.dat :

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

UPDATE

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

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

Ответ 2

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

Ответ 3

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

На странице man:

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 в script и имел двоичное расположение в переменной окружения zip, чтобы мы могли легко перейти на другой двоичный код zip, не внося тонны изменений в script.

Пример:

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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