2013-12-11 1 views
13

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

zip ./test/step1.zip $FILES 

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

zip warning: name not matched: myfile.dat 

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

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

+3

Можете ли вы предоставить 'ls -ltr' для' myfile.dat'? Я слышал о некоторых проблемах с слишком большими файлами и/или символическими ссылками. – eebbesen

ответ

9

зип предупреждение: имя не соответствует: 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

+0

Но я знаю, что этот файл в данной папке –

+0

Как я уже сказал, последний файл в списке имеет эту ошибку. Если я попытаюсь заархивировать файл type.txt вместе с файлом $ FILES, тогда type.txt получит это предупреждение и не будет включен в zip! –

+3

Тогда нам нужно больше деталей. Что такое $ FILES? Покажите ls по запросу. Следующее "работает для меня": '$ MkDir ziptest $ кд ziptest $ сенсорных а $ MkDir d $ сенсорного d/е $ пронестись foo.zip ABCD/е добавления: а (хранящийся 0%) добавления : b (сохранено 0%) добавлено: c (сохранено 0%) добавлено: d/e (сохранено 0%) ' –

0

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

+0

Оба './Myscript.sh' и' bash myscript.sh' должны работать.Если вы скажете, что скрипт начал работать после запуска 'dos2unix' на нем, это подтверждает то, что все уже подозревали, так как в конце вашего списка' $ FILES' был возврат каретки. – janos

+0

@janos. Вы правы, там был возврат каретки. Но есть проблема, если я запускаю скрипт с помощью bash myscript.sh. Но с ./myscript.sh мой скрипт работает отлично! –

0

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

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

0

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

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

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

1

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

1

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

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