Как распаковать и повторно заархивировать файлы в подкаталог с тем же именем, что и файл .zip?

Резюме
Мне нужно "исправить" пакет ZIP-файлов по всей файловой системе следующим образом:

  • замена " " (пробела) в их именах на "_", а также в именах файлов их содержимого
  • застегните их обратно

Застрял при распаковке, потому что "$(dirname "$0")/$(basename "$0")" выдает ошибки.

Более длинное описание
Иерархия файлов:

banners/
       |
       germany/
       |      |
       |      active/
       |      |     |
       |      |     300x250/
       |      |     |      |
       |      |     |      file.jpg
       |      |     |      AC2 xx.zip
       |      |     |
       |      |     600x228/
       |      |            |
       |      |            file.jpg
       |      |            AC4 xx.zip
       |      nautics/
       |
       |
       austria/
       |
       ...

Вот что я пробовал:

~/banners/> find . -name "*" -exec sh -c 'mv -- "$0" "$(0// /_)"' {} \;

Здесь я избавился от всех пробелов во всех именах файлов/каталогов от banners/ вниз.
AC2 xx.zip теперь выглядит как AC2_xx.zip

Теперь мне нужно разархивировать эти файлы .zip в новый подкаталог на том же уровне, что и сами файлы .zip, с теми же именами, что и эти файлы .zip.

Вот команда, которую я попробовал:

find . -name "*.zip" -exec sh -c 'unzip "$0" "$(dirname "$0")/$(basename "$0")"' {} \;

что дает мне кучу (полный экран) ошибок, подобных этой:

~>Архив: ./sun&sea/dugi_otok/970x250/SS4_970x250.zip
~>внимание: имя файла не совпадает: ./sun&sea/dugi_otok/970x250/SS4_970x250.zip

Для жизни меня я не могу понять это.

Повторно запустить удаление пробелов
Если это сработает и файлы будут разархивированы, план состоит в том, чтобы повторно запустить команду mv из каталога верхнего уровня banners/ и снова заменить пробелы на "_ " опять таки. Это позаботится о содержимом файлов .zip.

Повторно заархивировать
Наконец, мне нужно повторно заархивировать эти вновь созданные подкаталоги, названные как исходные файлы .zip, и перезаписать существующие файлы .zip (которые были изначально разархивированы).

В основном повторно заархивируйте это:

~> banners/germany/active/dugi_otok/300x250/AC2_xx/(newly unzipped contents)

в:

~> banners/germany/active/dugi_otok/300x250/AC2_xx.zip

Прошу прощения за путаницу, но я не нашел лучшего способа объяснить это.


person Alexander Starbuck    schedule 21.08.2016    source источник
comment
Почему вы добавили тег [базовый уровень]?   -  person Armali    schedule 24.08.2016


Ответы (2)


basename не удаляет расширение, поэтому ваш:

"$(dirname "$0")/$(basename "$0")"

просто воссоздает $0. Заменить:

"$(dirname "$0")/$(basename -s ".zip" "$0")"

опция -s для basename удаляет суффикс

ХТН

person CRD    schedule 21.08.2016

Теперь мне нужно разархивировать эти файлы .zip в новый подкаталог на том же уровне, что и сами файлы .zip, с теми же именами, что и эти файлы .zip.

Для этого подходит unzip вариант -d:

find . -name "*.zip" -exec sh -c 'unzip "$0" -d "${0%.zip}"' {} \; 

С помощью команды, которую вы попробовали, второй аргумент unzip был принят как имя файла для извлечения из zip-файла и, конечно же, не был найден в нем.

person Armali    schedule 24.08.2016