Linux gzip декілька підкаталогів в окремі архіви?


16

Як мені вдасться стиснути підкаталоги в окремі архіви?

Приклад:

directory
 subdir1
 subdir2

Потрібно створити subdir1 (.tar) .gz та subdir2 (.tar) .gz

Відповіді:


27

Цей невеликий сценарій, здається, найкращий варіант, враховуючи ваші вимоги:

cd directory
for dir in */
do
  base=$(basename "$dir")
  tar -czf "${base}.tar.gz" "$dir"
done

Він належним чином обробляє каталоги з пробілами в їх назвах.


Це дає мені цю помилку: bash: -c: рядок 1: синтаксична помилка: несподіваний кінець файлу
EarthMind

@EarthMind: Тут добре працює. Перевірте, чи правильно був скопійований сценарій.
Джуліано

@EarthMind: Тоді я не впевнений, що ви добре прописали оригінальне запитання. Ви хочете запустити це ще раз і отримати нові .tar.gz файли, залишивши попередні .tar.gz файли в спокої? Спробуйте додати "tmstamp = $ (дата '+% Y% m% d-% H% M')" та змініть $ {base} на $ {base} - $ {tmstamp}.
freiheit

2
@EarthMind: якщо ви збираєтеся поставити все в один рядок, переконайтеся, що є крапка з комою (;) перед командою tar. В іншому випадку база передається як змінна середовища до tar, замість допоміжної змінної оболонки.
Джуліано

@mwojtera ваша спроба редагування повинна бути власною відповіддю
пташенята

10

Як щодо цього: find * -maxdepth 0 -type d -exec tar czvf {}.tar.gz {} \;

Пояснення: Ви запускаєте знахідку по всіх елементах у поточному каталозі. Maxdepth 0 змушує не повторювати нижче наведених аргументів. (У цьому випадку * або всі елементи у вашому поточному каталозі) Аргумент 'd' до "-type" відповідає лише каталогам. Потім exec запускає дьоготь на будь-які матчі. ({} замінюється відповідним файлом)


1
Але тоді я все-таки отримую помилку, що даний шлях - це каталог, а не файл
EarthMind

3
gzip поодинці не архівує каталоги
Juliano

Потрібно орієнтувати каталоги перед тим, як отримати їх.
phaphink

1
Вам потрібен tar з опцією z, а не прямий gzip для каталогів. Дуже приємне використання знахідки.
freiheit

3
Помилка: "find: paths повинен передувати виразу:;" Перша частина працює, тому я використовував (лише каталоги): for dir in `find * -maxdepth 0 -type d`; do tar -cvzf ${dir}.tar.gz ${dir}; done
JosephK

4

Це створить файл під назвою blah.tar.gz для кожного файлу в каталозі під назвою blah.

$ cd directory
$ for dir in `ls`; do tar -cvzf ${dir}.tar.gz ${dir}; done

Якщо у вас є більше ніж просто каталоги в каталозі (тобто файли, як ls поверне все в каталозі), тоді використовуйте це:

$ cd directory
$ for dir in `find . -maxdepth 1 -type d  | grep -v "^\.$" `; do tar -cvzf ${dir}.tar.gz ${dir}; done

Grep -v виключає поточний каталог, який відображатиметься в findкоманді за замовчуванням.


3
І ls, і знахідка НЕ ​​були зроблені для використання таким чином. Зокрема, він призначений для подання файлів у читаному користувачем списку, а не для генерування списків файлів як аргументів "для". Просто використовуйтеfor dir in *
Джуліано

1
Я спробував вашу першу пропозицію, але вона не працює з каталогами, що містять пробіли в їх імені
EarthMind

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