Я нашел решение о том, как архивировать все папки в подпапке.
for i in */*; do zip -r "${i%/}.zip" "$i"; done
Проблема состоит в том, что я хочу назвать .zip папки следующим образом: parentFolder_zippedFolder.zip
, но я хочу поддержать структуру кода, показанную выше, если это возможно. Я хотел бы, чтобы это было похоже
for i in */*; do zip -r "parentFolderName"" + ${i%/}.zip" "$i"; done
если это возможно, но я не мог бы найти способ сделать это в сценарии удара.
Учитывая структуру папок, подобную этой:
./parent
./parent/child1
./parent/child1/data1
./parent/child2
./parent/child2/data2
Выполнение этой команды: for i in */*; do zip -r "${i/\//_}.zip" "$i"; done
создаст следующие файлы:
./parent_child1.zip
./parent_child2.zip
Содержимое такое же, как с командой в вашем вопросе, с именами, как вы просили их.
Обратите внимание, что zip-файлы создаются на один уровень выше по сравнению с вашей командой. Ваша команда создает zip-файлы в каталоге parent
, моя команда создает их вместе с родительским каталогом.
${i/\//_}
является заменой bash
, которая заменяет символ /
внутри переменной i
на символ _
. Поскольку символ /
является особым в bash
, мы должны избежать его, давая \/
. Если бы мы заменили букву t
, подстановка была бы ${i/t/_}
.