команда для поштового замовлення декількох каталогів в окремі файли zip


40

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

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

Таким чином, врешті-решт мій основний каталог буде заповнений усіма моїми оригінальними підкаталогами, а також відповідними .zipфайлами, що містять вміст, що скомпонований у кожному підкаталозі.

Чи можливо щось подібне? Якщо так, будь ласка, покажіть мені, як це робиться.


Я пропоную вам підібрати, як можна зробити «шлейфи» в оболонці. Є он-лайнєри, які можуть робити все, що завгодно, але приємна петля буде набагато зрозумілішою.
lynxlynxlynx

Так це означає, що мені потрібно написати окремий скрипт оболонки, а потім викликати цей скрипт із командного рядка? Вибачте за таке елементарне запитання. Хоча у мене є певний досвід програмування, цей матеріал для мене є новим.
Евстер

Відповіді:


75

Ви можете використовувати цю петлю в bash:

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

i- це ім'я змінної циклу. */означає кожен підкаталог поточного каталогу, і він буде включати в себе імена косої риски. Переконайтеся, що ви cdв потрібному місці, перш ніж це виконати. "$i"просто називає цей каталог, включаючи кінцеву косу рису. Лапки гарантують, що пробіл у назві каталогу не спричинить проблем. ${i%/}це як, $iале з вилученою косою косою рисою, так що ви можете використовувати це для побудови імені zip-файлу.

Якщо ви хочете побачити, як це працює, включіть echoкоманду a перед zipі ви побачите команди, надруковані замість виконаних.


Дякую, це виглядає чудово! Однак одна з можливих проблем, про яку я подумав: чи буде цей ZIP-каталог ВСІХ каталогів у кожному під-каталозі в окремі файли? Я хочу лише копіювати підкаталоги 1-го рівня як єдині стислі файли. Я не хочу створювати додаткові файли zip для підкаталогів 2-го рівня, 3-го рівня тощо. Будь ласка, дайте мені знати, чи це має сенс. Знову дякую!
Евстер

Лише першого рівня, як ви просили.
lynxlynxlynx

В */іменах кожні прямі підкаталогів, не кожен нащадок каталогу. Таким чином, ви отримаєте блискавки лише для самого верхнього рівня, саме так, як вам захочеться. Версія з echoнею продемонструвала б цей аспект. Зіставлення кожного вкладеного каталогу у власний файл насправді було б більшою роботою, і, ймовірно, найкраще вирішити за допомогою find -type dінших хитрощів.
MvG

1
@fritzmg: Місцевий тест на моєму Linux свідчить, що так, файли, що починаються з крапки, включаються. Це буде властивістю інструменту Info-ZIP, а не команди, яку я дав, тому залежно від того, який ваш zipбінарний файл, ви можете отримати іншу поведінку. Для того, щоб також створювати поштові файли для каталогів верхнього рівня (тобто дітей поточного каталогу), починаючи з крапки, ви можете використовувати shopt -s dotglobдля того, щоб шаблони глобусу відповідали прихованим файлам.
MvG

1
Щоб створити поштовий індекс, який не має батьківського каталогу в якості кореня:for i in */; do (cd "$i"; zip -r "../${i%/}.zip" .); done
chris
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.