команда, чтобы сжать несколько каталогов в отдельные файлы ZIP

40

У меня есть один каталог, который содержит десятки каталогов внутри него.

Я новичок в командной строке, и я изо всех сил пытаюсь придумать команду, которая заархивирует каждый подкаталог в уникальный файл sub-directory.zip.

Таким образом, в конце мой основной каталог будет заполнен всеми моими исходными подкаталогами, а также соответствующими .zipфайлами, которые содержат сжатый контент каждого подкаталога.

Возможно ли что-то подобное? Если так, пожалуйста, покажи мне, как это делается.

Evster
источник
Я предлагаю вам посмотреть, как можно сделать «для циклов» в оболочке. Есть лайнеры, которые могут делать то, что вы хотите, но хороший цикл будет намного понятнее.
lynxlynxlynx
Значит ли это, что мне нужно написать отдельный скрипт оболочки, а затем вызвать этот скрипт из командной строки? Извините за такой элементарный вопрос. Хотя у меня есть некоторый опыт программирования, это новость для меня.
Евстер

Ответы:

76

Вы можете использовать этот цикл в bash:

for i in */; do zip -r "${i%/}.zip" "$i"; done

iэто имя переменной цикла. */означает каждый подкаталог текущего каталога и будет включать в себя в конце имена косую черту. Убедитесь, что вы cdв нужном месте, прежде чем выполнять это. "$i"просто называет этот каталог, включая косую черту. Кавычки гарантируют, что пробелы в имени каталога не вызовут проблем. ${i%/}похоже, $iно с удаленной косой чертой, так что вы можете использовать это для создания имени файла zip.

Если вы хотите увидеть, как это работает, добавьте echoперед zipи вы увидите напечатанные команды вместо выполненных.

MVG
источник
Спасибо, это выглядит великолепно! Однако я подумал об одной потенциальной проблеме: будет ли это архивировать ВСЕ каталоги в каждом подкаталоге в отдельные файлы? Я только хочу сжать подкаталоги 1-го уровня как отдельные сжатые файлы. Я не хочу создавать дополнительные zip-файлы для подкаталогов 2-го уровня, 3-го уровня и т. Д. Пожалуйста, дайте мне знать, если это имеет смысл. Еще раз спасибо!
Евстер
Только на первом уровне, как вы просили.
lynxlynxlynx
В */именах каждые прямые подкаталогов, не каждый потомок каталога. Таким образом, вы получите только молнии для самого верхнего уровня, именно так, как вы хотите. Версия, содержащаяся echoв нем, продемонстрировала бы этот аспект. Архивирование каждого вложенного каталога в свой собственный файл на самом деле было бы более трудоемким, и, вероятно, лучше всего решить его, используя find -type dдругие приемы.
MvG
1
@fritzmg: локальный тест на моем Linux показывает, что да, файлы, начинающиеся с точки, включены. Это было бы свойством инструмента Info-ZIP, а не команды, которую я дал, поэтому в зависимости от того, какой у вас zipдвоичный файл, вы можете получить другое поведение. Чтобы также создавать zip-файлы для каталогов верхнего уровня (т. Е. Дочерних элементов текущего каталога), начиная с точки, вы также можете использовать shopt -s dotglobдля сопоставления шаблонов глобуса скрытые файлы.
MvG
1
Чтобы создать zip-файл, в котором родительский каталог не имеет корневого каталога:for i in */; do (cd "$i"; zip -r "../${i%/}.zip" .); done
chris