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


201

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

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


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

Ответы:


387
tar -zcvf compressFileName.tar.gz folderToCompress

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

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


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).
Ортвин Ангермейер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.