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


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.