Intereting Posts
Как запустить сразу два приложения в терминале Как скомпилировать, когда на компьютере недостаточно памяти? Подскажите пользователю об отказе в безопасности Linux Debian Lenny: Хотите, чтобы Splashy начинался сразу после Grub2 Прокрутите только архив данных .zip только для чтения, чтобы извлечь строку из файла .kml в Экран становится черным на ноутбуке (Debian stretch + cinnamon) Создание точечного скрипта Как использовать один nic для трафика хранения и другого для сетевого трафика в Linux (Slackware)? Отладка висячего процесса bash Mint GUI не запускается Список * все * IP-маршруты к месту назначения в таблице маршрутизации Linux Могу ли я создать макрос mutt для ответа и архивации? Резервное копирование всего содержимого текущего каталога в подкаталог внутри текущего каталога, который будет создан, если он не существует Как проверить man-страницы для того, что делает один параметр команды? Упорно смонтировать удаленную файловую систему? т.е. SSHFS / mosh?

Как закрепить многие подкаталоги n-го уровня без их верхнего (родительского) каталога?

в такой структуре файловой системы:

root/ | container1/ | | | subdir2/ | | | subdir3/ | | | subdir4/ | | | file1 | file2 | subdir5/ container2/ |... 

Мне нужно застегнуть все:

  • под `/ subdir4 /` `
  • без самого /subdir4/
  • во всех потенциальных /container/ поддиректорах каталога root/
  • назовите zip так же, как родительская папка содержимого, зашифрованного (в этом случае это будет «subdir4.zip»)

Пожалуйста, запомни:

  • это не настоящие имена dirs и subdirs, это просто приближение
  • Я использую ZSH на Mac OSX
  • Я совершенно новый для сценариев Unix / Linux

Мне бы очень хотелось, чтобы это было простое, простое, одноразовое решение, поэтому я могу как можно больше научиться и быть гибким в модификации этого решения для других потенциальных случаев.

Вот что я пробовал до сих пор , как предложили друзья:

 find . -mindepth 5 -maxdepth 5 -type d -exec sh -c ' pushd "$0/..";zip -rFS "$(basename "$0").zip" "$(basename "$0")";popd ' {} \; 

Тем временем я узнал, что это решение имеет следующие недостатки:

  • $ 0 не следует использовать в качестве позиционного параметра, потому что он используется в отчетах об ошибках и / или в качестве имени сценария оболочки (в моем случае это всего лишь строка)
  • basename и dirname лучше избегать при использовании bash (подробнее здесь )
  • этот синтаксис, с ... {} \; вызывает столько оболочек, сколько есть результатов, предположительно неэффективный способ выполнения этого типа операции

Я должен был использовать:

  • $ 1 в моих позиционных параметрах
  • ... ;popd ' sh {} +

Он должен получить все результаты в виде «массива / списка» и применять команды в строке, переданной в sh одновременно.

Благодаря!

БОНУСНЫЕ ПУНКТЫ: 🙂

  • могу ли я назвать полученный .zip таким же, как /subdir3/ вместо as /subdir4/ из этой иерархии?

Вы можете использовать awk для создания системной команды для выполнения

 find * -mindepth 5 -maxdepth 5 -type d | awk -F"/" '{system( "cd "$0"; zip -rF "$NF".zip *")}' 

-F разбивает строку на /, $0 представляет собой полную строку, а $NF имеет ваше фактическое имя каталога. Попыта нет, поскольку системная команда выполняется в своей собственной оболочке, а родительская оболочка остается в текущем рабочем каталоге.