Моя машина работает, Debian 6.0.7
и у меня есть Zip 3.0 (July 5th 2008), by Info-ZIP
. Когда я пытаюсь распаковать .zip-файл, в 2~3 случаях из 10 он не извлекает все. Не хватает 2-3 файлов.
Сначала я думал, что это из-за размера файла и некоторых ограничений, о которых я не знал, но потом я заметил, что это происходит и с маленькими файлами по 150 МБ. Затем я подумал, что, возможно, это из-за того, что я распаковываю его через файл скрипта bash, поэтому я попробовал вручную распаковать файлы, и снова это не было проблемой.
Наконец, сегодня я проверил его с помощью 140-мегабайтного .zip-файла. Я извлекал файл вручную и с помощью моего .sh-скрипта 10 раз, и после каждого раза я запускал, ls -h -R > ../test_n.txt
чтобы вести учет папки после каждой распаковки. После сравнения всех 20 файлов я увидел, что 7 из 20 раз он пропускал от 2 до 8 файлов из .zip-файла.
Есть ли у кого-нибудь идеи, почему это может происходить?
решение1
Я понятия не имею, что может происходить... однако, вот несколько вещей, которые вы можете попробовать, чтобы устранить проблему:
Если в этой
zip
версии есть-l
флаг или что-то еще, позволяющее проверить, какие файлы находятся в zip-файле, не распаковывая его, это может помочь.zip -l file.zip
Это покажет вам содержимое zip-файла, поэтому вы должны ожидать, что после его распаковки будет получено такое же количество файлов — вы можете использовать это в качестве теста в своем скрипте, просто чтобы убедиться, что вы всегда распаковываете их все.
Действительно ли файлы zip правильные? Если вы получаете файл из другого источника, возьмите контрольную сумму файла и сравните ее с zip-файлом, который вы пытаетесь распаковать. Если они отличаются, то причиной этой проблемы может быть повреждение файла.
Какой код возврата у
zip
команды? После распаковки файла с помощьюzip
выполнитеecho $?
команду, чтобы проверить код возврата для него — если он отличается от нуля, то программа сообщает вам, что каким-то образом выполнение программы в целом не было успешным. Обратите внимание, что это значение может меняться, но, насколько мне известно, использование нуля для успешного выполнения и других чисел для ошибки/предупреждения является довольно стандартным для утилит unix/linux.
Надеюсь, это поможет :)