Стисніть кожен файл у каталозі у власний стислий файл


25

Як я стискаю кожен файл у каталозі до власного дьогтю, зберігаючи ім’я кожного файлу?

тобто file1.out file2.out

->

file1.out.tar.gz file2.out.tar.gz

Відповіді:


64

Поміщення кожного файлу в окремий файл tar не має сенсу в цьому сценарії. Ви можете використовувати gzipїх для прямого стиснення:

gzip *

приведе file1.out.gz, і file2.out.gzт.д.

Ви б використовували tarлише, якщо вам знадобиться стислий архів як один файл.

Якщо вам потрібен архів tar, для кожного файлу ви можете створити його так:

for i in *; do tar -czf $i.tar.gz $i; done

7
+1 - Немає підстав створювати тар (Tape ARchive) для одного файлу. Просто стисніть те, що ви хочете стиснути - результат буде незначно меншим, а люди витягують файли нескінченно більше.
voretaq7

Для орієнтування на кожен окремий підкаталог (лише один рівень глибоко) та видалення оригіналу:find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done
xb.

(не можу редагувати коментар вище через 5 хв) Простіша / безпечніша версія:find . -maxdepth 1 -mindepth 1 -type d -exec tar -zcvf {}.tgz {} --remove-files \;
xb.

9

Щоб створити відповідь на @ SvenW (яка працюватиме лише в поточному каталозі), якщо у вас є ВЕЛИЧЕЗНА кількість номерів або хочете це зробити в рекурсивній структурі каталогу, ви також можете використовувати

find . -type f -exec gzip \{\} \;

і якщо вам потрібно помістити вихід у інший каталог (у цьому прикладі ../target) і не хочете видаляти оригінали, ви можете зробити щось на кшталт:

find . -type f -print | while read fname ; do
    mkdir -p "../target/`dirname \"$fname\"`"
    gzip -c "$fname" > "../target/$fname.gz"
done

1
find . -type f -exec gzip {} \;буде достатньо Другий код не може мати імена файлів, що містять пробіли тощо.
користувач невідомий

Деякі снаряди не люблять голих {} s, а другі роблять щось помітно відмінне від першого (і я знав про проблеми з інтервалом, але це дуже складно).
пухнастий

Якщо вам відома така оболонка, я запрошую вас відповісти на моє запитання тут: unix.stackexchange.com/questions/8647/… . Ніхто не зміг назвати те, що сьогодні використовується. Якщо вам відомо про ризик вашої відповіді, можливо, було б корисно назвати це у своїй відповіді.
користувач невідомий

@userunknown Мене виховували на (t) csh, у якого було досить багато проблем з нерозгляненими фігурними фігурними дужками свого часу, хоча це вже не здається (але я все одно рятуюся {}як сила звички). Однак інші вже розмістили їх як відповіді на ваше запитання.
пухнастий

Або для стиснення всіх небінарних файлів:find . -type f -exec grep -Iq . {} \; -and -exec gzip {} \;
xb.

0

Спробуйте це:

#!/bin/bash
for fich in *; do
    if [ "$fich" != "*" ] ; then
        gzip -9 -c $fich > $fich.tar.gz
        \mv $fich.tar.gz $fich
    fi
done
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.