#linux #archive #unzip
#linux #Архив #распаковать
Вопрос:
У меня есть zip-архив в Linux, в который я загружаю каждый день ~ 20 файлов с датой (в формате ггггммдд) в имени. Мне нужно извлечь все файлы с выбранного дня, поэтому я проверяю, есть ли они в архиве
unzip -l fileArchive.zip | grep 20160910
и в результате я вижу 17 файлов, чего я и ожидал:
32471137 09-12-2016 21:07 TRANSACTIONS_20160910.csv
181 09-13-2016 21:00 FILE1_D_20160910.CSV
9345 09-13-2016 21:00 FILE2_D_20160910.CSV
142 09-13-2016 21:00 FILE3_D_20160910.CSV
6307637 09-13-2016 21:00 FILE4_D_20160910.CSV
783975 09-13-2016 21:01 FILE5_D_20160910.CSV
4812 09-13-2016 21:01 FILE6_D_20160910.CSV
88306 09-13-2016 21:01 FILE7_D_20160910.CSV
47 09-13-2016 21:01 G_TEXTE000_D_20160910.CSV
510 09-13-2016 21:01 FILE9_D_20160910.CSV
163646 09-13-2016 21:01 FILE10_D_20160910.CSV
51 09-13-2016 21:02 FILE11_D_20160910.CSV
158654 09-13-2016 21:02 FILE12_D_20160910.CSV
31724 09-13-2016 21:02 FILE13_D_20160910.CSV
269337 09-13-2016 21:02 FILE14_D_20160910.CSV
89 09-13-2016 21:02 FILE15_D_20160910.CSV
76 09-13-2016 21:03 FILE16_D_20160910.CSV
70 09-13-2016 21:01 FILE17_D_20160910.CSV
На следующем шаге я хочу извлечь эти файлы, используя unzip с маской вместо списка файлов для извлечения:
unzip fileArchive.zip *20160910* -d /var/tmp/
и в результате извлекается только один файл:
Archive: fileArchive.zip
inflating: /var/tmp/G_TEXTE000_D_20160910.CSV
что, безусловно, неправильно, потому что, когда я выполняю идентичную операцию с другой маской, команда unzip с маской извлекает все файлы, которые ранее перечислены с помощью unzip -l.
К счастью, я могу разархивировать все эти файлы, указав точные имена в списке:
unzip fileArchive.zip TRANSACTIONS_20160910.csv FILE1_D_20160910.CSV FILE2_D_20160910.CSV ... FILE17_D_20160910.CSV -d /var/tmp/
Таким образом, архив не поврежден. Просто разархивируйте для этого один день 20160910 терпит неудачу при использовании маски.
У вас есть какие-либо идеи, что может быть не так? С уважением,
Отредактировано: ниже приведен полный код (вырезаны фрагменты имен файлов), который показывает, что маска без кавычек работает для симметричного архива «sk», а для этого «cz» — нет.
Я разархивирую файлы «cz» с кавычками — работает нормально, меняю каталог и разархивирую файлы «sk» без кавычек — работает нормально, меняю каталог и пытаюсь разархивировать файлы «cz» без кавычек — распаковывается только один файл.
$ pwd
/root_path/cz/input_data/fileArchive
$ unzip fileArchive.zip '*20160910*' -d /var/tmp/
Archive: fileArchive.zip
inflating: /var/tmp/CZ_C_BAL_D_20160910.csv
inflating: /var/tmp/CZ_ERNAL_D_20160910.CSV
inflating: /var/tmp/CZ_A2iMX_D_20160910.CSV
inflating: /var/tmp/CZ_MENT_D_20160910.CSV
inflating: /var/tmp/CZ_IER0_D_20160910.CSV
inflating: /var/tmp/CZ_VIDU_D_20160910.CSV
inflating: /var/tmp/CZ_ONNEL_D_20160910.CSV
inflating: /var/tmp/CZ_ENT0_D_20160910.CSV
inflating: /var/tmp/CZ_E000_D_20160910.CSV
inflating: /var/tmp/CZ_IST0_D_20160910.CSV
inflating: /var/tmp/CZ_STE_D_20160910.CSV
inflating: /var/tmp/CZ_TLOG_D_20160910.CSV
inflating: /var/tmp/CZ_ENTS_D_20160910.CSV
inflating: /var/tmp/CZ_ERE0_D_20160910.CSV
inflating: /var/tmp/CZ_VIDU_D_20160910.CSV
inflating: /var/tmp/CZ_TEG_D_20160910.CSV
inflating: /var/tmp/CZ_TEGY_D_20160910.CSV
inflating: /var/tmp/CZ__ECH_D_20160910.CSV
$ pwd
/root_path/cz/input_data/fileArchive
$ cd /root_path/sk/input_data/fileArchive
$ unzip fileArchive.zip *20160910* -d /var/tmp/
Archive: fileArchive.zip
inflating: /var/tmp/SK_D_20160910.csv
inflating: /var/tmp/SK_XTERNAL_D_20160910.CSV
inflating: /var/tmp/SK_X_D_20160910.CSV
inflating: /var/tmp/SK_MENT_D_20160910.CSV
inflating: /var/tmp/SK_IER0_D_20160910.CSV
inflating: /var/tmp/SK_VIDU_D_20160910.CSV
inflating: /var/tmp/SK_ONNEL_D_20160910.CSV
inflating: /var/tmp/SK_ENT0_D_20160910.CSV
inflating: /var/tmp/SK_E000_D_20160910.CSV
inflating: /var/tmp/SK_IST0_D_20160910.CSV
inflating: /var/tmp/SK_STE_D_20160910.CSV
inflating: /var/tmp/SK_TLOG_D_20160910.CSV
inflating: /var/tmp/SK_ENTS_D_20160910.CSV
inflating: /var/tmp/SK_ERE0_D_20160910.CSV
inflating: /var/tmp/SK_VIDU_D_20160910.CSV
inflating: /var/tmp/SK_TEG_D_20160910.CSV
inflating: /var/tmp/SK_TEGY_D_20160910.CSV
inflating: /var/tmp/SK__ECH_D_20160910.CSV
$ cd /root_path/cz/input_data/fileArchive
$ unzip fileArchive.zip *20160910* -d /var/tmp/
Archive: fileArchive.zip
replace /var/tmp/CZ_E000_D_20160910.CSV? [y]es, [n]o, [A]ll, [N]one, [r]ename: A
inflating: /var/tmp/CZ_E000_D_20160910.CSV
Это неудобно!
Я бы ожидал, что цитата маски будет работать с обоими архивами одинаково
Комментарии:
1. Что это за результат
ls -hl /root_path/sk/input_data/fileArchive
?2. Я сделал для обоих каталогов:
ls -hl /root_path/sk/input_data/fileArchive
возвращает-rwxrwx--- 1 jd74630 root 1.2G Nov 3 21:36 fileArchive.zip
для cz возвращает-rwxrwx--- 1 jd74630 root 4.1G Nov 3 21:36 fileArchive.zip
Интересно, что теперь распаковка с помощью маски работает только с кавычками3. В какой-то момент вы случайно разархивировали файлы
/root_path/sk/input_data/fileArchive
. Позже вы их удалили.4. Хорошо, я вас неправильно понял. Конечно, эти файлы были ранее (много попыток) извлечены в целевой каталог. Моя проблема не подсказывает, хочу ли я заменить или переименовать. Моя проблема в том, что после обработки этого файла (CZ_E000_D_20160910.CSV) ни один из оставшихся совпадающих файлов маски не был извлечен. Но с кавычками на маске были извлечены оставшиеся файлы. Я очистил целевую папку и повторил эксперимент. Результатом является то, что
Ответ №1:
На странице руководства для unzip(1)
написано
Обязательно заключайте в кавычки любой символ, который иначе может быть интерпретирован или изменен операционной системой, особенно в Unix и виртуальных машинах.
Попробуйте
unzip fileArchive.zip '*20160910*' -d /var/tmp/
Комментарии:
1. Спасибо! Это помогло. Единственная странность в том, что у меня есть другой симметричный архив для файлов другой страны. И с этим вторым архивом этой проблемы не было. Затем все перечисленные файлы для 20160910 были разархивированы.
2. Вы ранее разархивировали файлы? Без одинарных кавычек оболочка развернет файл
*20160910*
в список файлов.3. Нет этих файлов, но файлы с одинаковыми именами из симметричного архива в другом месте. Я вставлю вывод в основное поле — здесь слишком долго.
4. Я предполагаю, что вы уже извлекли файлы
/root_path/cz/input_data/fileArchive
, поэтому подстановочный знак передал этот список файловunzip
.5. Нет, эти файлы не извлекаются в это местоположение. Временно они удаляются в другой каталог, затем автоматизированный процесс импортирует их в базу данных и команду операционной системы
zip IMPORTED_FILE -m fileArchive/fileArchive.zip