Сжать каждый файл в каталоге в свой собственный сжатый файл


25

Как мне сжать каждый файл в каталоге в свой собственный tar, сохранив имя для каждого файла?

то есть 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 - Нет причин создавать tar (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 {} \;будет достаточно. Второй код потерпит неудачу с именами файлов, содержащими пробелы и тому подобное.
пользователь неизвестен

Некоторым оболочкам не нравятся голые {}, а второй делает что-то заметно отличающееся от первого (и я знал о проблемах с пробелами, но с этим довольно сложно разобраться).
пушистый

Если вы знаете такую ​​оболочку, я предлагаю вам ответить на мой вопрос здесь: 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.