Як зафіксувати кілька файлів в окремих архівах?


3

Зізнаюся, це питання тут задавали раніше:

Як і Zip в окремі файли, де людина, яка запитувала, не вказала ОС, яку він використовував, і не отримала відповідей.

Мені потрібно розділити величезний каталог на кілька .zip-файлів, які не залежать один від одного. Отже, замість:

file1.zip
file2.z01
файл3.z02

Я б хотів наступний набір файлів:

file1.zip
file2.zip
file3.zip

В основному це моє питання. Я на OS X, тому сценарій оболонки або AppleScript був би найпростішим способом.

Крім того, ось хлопець запитав те саме - тільки він хотів створити .tar архів: Як створити окремі архіви для набору файлів

Відповідь правильна, але це призведе до файлів tar:

for file in `ls *`; do tar -czvf $file.tar.gz $file ; done

Будь-яка допомога з цим вдячна.


PS: Ця остання частина призначена саме для тих, хто вміщений у клавіатурі Maestro:

Я також намагався виконати це в клавіатурі Maestro, у мене є налаштування дій "для кожного", яке визначає шляхи до файлів, а потім запускає скрипт оболонки. Вихід правильний, і макрос працює, якщо вставити його в термінал (наприклад zip /Users/me/Desktop/test /Users/me/Desktop/test.txt).

Однак, коли я передаю дві змінні скрипту оболонки на клавіатурі Maestro, не вийде:
zip "$KMVAR_zipPath" "$KMVAR_sourcePath"

Дякую.


Ну, ви намагалися замінити tar -czvfз zipв tarрозчині?
Даніель Бек

@DanielBeck Так, це було перше, що я спробував.
pattulus

Відповіді:


15

Рішення досить просте. Якщо ви хочете зробити це для кожного файлу, використовуйте рекурсивно, використовуйте find. У ньому будуть перераховані всі файли та каталоги, що також попадають у підкаталоги.

find . -type f -execdir zip '{}.zip' '{}' \;

Пояснення:

  • Перший аргумент - це каталог, з якого ви хочете почати, .
  • Тоді ми обмежимо його лише для пошуку файлів ( -type f)
  • -execdirОпція дозволяє виконати команду на кожному знайдений файл, виконавши його з каталогу файлу
  • Ця команда оцінюється, як zip file.txt.zip file.txt, наприклад, оскільки всі входження {}замінені фактичним іменем файлу. Цю команду потрібно закінчити\;

Звичайно, findє більше варіантів. Якщо замість цього ви просто хочете залишитися у вашому поточному каталозі, а не спускатися в підкаталоги:

find . -type f -maxdepth 1 -execdir zip '{}.zip' '{}' \;

Якщо ви хочете обмежити його певними типами файлів, скористайтеся -nameопцією (або -inameдля невідповідності регістру):

find . -type f -name "*.txt" …

Все, що завгодно (включаючи циклічне forзавершення на виході з ls *), на мою думку, є досить некрасивим синтаксисом і, швидше за все, зламається, наприклад, на файли з пробілами на їх ім'я або через занадто багато аргументів.


Дякую, але тут не працює. Вихід при вставці рекурсивного: cl.ly/Gzbh --- Я не заперечував би із зазначенням файлів, які потрібно поштовувати розширенням, якщо це полегшить.
pattulus

На жаль, дивіться моє оновлення. zipпотребує розширення, якщо файли є. Для файлів без розширення він автоматично додасть .zip
slhck

Приємно, це чудово працює. Велике спасибі. --- Щодо бонусних балів: ви б не хотіли сказати мені, як це зробити для певного типу файлу, cf з розширенням ".txt"? Я спробував кілька варіантів, але…
pattulus

Дивіться моє друге оновлення. Перевірте сторінку сторінки find, все пояснено досить добре, і якщо ви її ще не використовували, мабуть, це один з найкорисніших інструментів * nix-системи.
slhck

Дякуємо за оновлення. Я дивлюся на "знахідку людини" і це справді здається великим корисним інструментом.
pattulus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.