В списке распаковки Linux с маской не удается извлечь все соответствующие файлы

#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