Как сжать все файлы во всех подкаталогах в один сжатый файл в Bash

201

Возможное дублирование:
сжатие набора каталогов и создание сжатого tar-файла

В этом посте описывается, как сжать каждый файл отдельно в структуре каталогов. Однако мне нужно сделать что-то немного другое. Мне нужно создать один большой файл GZIP для всех файлов в определенном каталоге. Мне также нужно иметь возможность указать имя выходного файла для сжатого файла (например, files.gz) и перезаписать старый файл сжатого файла, если он уже существует.

Doug
источник
gzipпо самой своей природе сжимает только один файл. Чтобы поместить несколько файлов в один файл для последующего архивирования, используйте tar.
Томас

Ответы:

387
tar -zcvf compressFileName.tar.gz folderToCompress

все в папке ToCompress пойдет на compressFileName

Изменить: После просмотра и комментариев я понял, что люди могут запутаться с compressFileName без расширения. Если вы хотите, вы можете использовать расширение .tar.gz (как предложено) с compressFileName

amitchhajer
источник
2
Спасибо. Будет ли это сжимать все под "folderToCompress" (т.е. рекурсивно)?
Даг
2
все в папке ToCompress пойдет на сжатие
FileName
80
Возможно, вы захотите выбрать, compressFileNameтак что он включает в себя .tar.gzрасширение, или вы будете сводить всех остальных с ума.
drewish
9
Это также работает для произвольного числа каталогов, например tar -zcvf two-dirs.tar.gz dir-one dir-two, создаст архив, содержащий две директории.
Золтан
5
Также работает с тем, *чтобы сжать все в текущем tar -zcvf all.tar.gz *
61

Есть много методов сжатия, которые работают рекурсивно в командной строке, и хорошо знать, кто является конечной аудиторией.

то есть, если это нужно отправить кому-то, работающему с Windows, тогда лучше всего использовать zip:

zip -r file.zip folder_to_zip

unzip filenname.zip

для других пользователей Linux или сам по себе tar отлично

tar -cvzf filename.tar.gz folder

tar -cvjf filename.tar.bz2 folder  # even more compression

#change the -c to -x to above to extract

Нужно быть осторожным с tar и с тем, как все происходит / извлекается, например, если я запускаю

cd ~
tar -cvzf passwd.tar.gz /etc/passwd
tar: Removing leading `/' from member names
/etc/passwd


pwd

/ Главная / MyUserName

tar -xvzf passwd.tar.gz

это создаст / home / myusername / etc / passwd

не уверены, что все версии tar делают это:

 Removing leading `/' from member names
В.Х.
источник
18

Сообщение @amitchhajer работает для GNU tar. Если кто-то найдет этот пост и ему нужно, чтобы он работал в НЕ- GNUсистеме, он может сделать это:

tar cvf - folderToCompress | gzip > compressFileName

Чтобы расширить архив:

zcat compressFileName | tar xvf -
Джереми Дж. Старчер
источник
2
В дополнение к переносимости, это решение полезно, если вы хотите передать аргументы в gzip (например, --test или --best), так как afaik, даже GNU tar не предоставляет способ отправки аргументов в gzip.
Тимоти Вудс
Это универсально, так как вы также можете использовать другие компрессоры. Например, pigzэто быстрее, поскольку он может лучше использовать процессор (многопоточная реализация zip).
Ортвин Ангермейер