Як gzip всі файли у всіх підкаталогах в один стислий файл в bash


201

Можливий дублікат:
збирання набору каталогів та створення файлу, стисненого дьогтем

У цій публікації описано, як gzip кожен файл окремо в структурі каталогу. Однак мені потрібно зробити дещо інше. Мені потрібно створити один великий gzip-файл для всіх файлів у певному каталозі. Мені також потрібно мати можливість вказати назву вихідного файлу для стисненого файлу (наприклад, files.gz) та перезаписати старий файл стисненого файлу, якщо такий вже існує.


gzipза своєю суттю стискає лише один файл. Щоб помістити кілька файлів в один файл для подальшого gzipping, використовуйте tar.
Томас

Відповіді:


387
tar -zcvf compressFileName.tar.gz folderToCompress

все, що знаходиться в папціToCompress, перейде до компресіїFileName

Редагувати: Після огляду та коментарів я зрозумів, що люди можуть заплутатися у компресії без розширення. Якщо ви хочете, ви можете скористатися розширенням .tar.gz (як пропонується) разом з compressFileName


2
Дякую. Чи стисне це все під "папкоюToCompress" (тобто, рекурсивно)?
Даг

2
все в папціToCompress піде на compressFileName
amitchhajer

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

9
Це також працює для довільної кількості каталогів, наприклад tar -zcvf two-dirs.tar.gz dir-one dir-two, створить архів, що містить два каталоги.
Золтан

5
Також працює з тим, *щоб стиснути все в поточному режимі, тобто .:tar -zcvf all.tar.gz *

61

Є багато методів стиснення, які працюють рекурсивно командним рядком, і добре знати, хто кінцева аудиторія.

тобто, якщо його потрібно надіслати комусь із запущеним Windows, то, напевно, найкраще буде поштовий індекс:

zip -r file.zip folder_to_zip

unzip filenname.zip

для інших користувачів Linux або ваш власний тар - це чудово

tar -cvzf filename.tar.gz folder

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

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

Потрібно бути обережним з дьогтем і тим, як все відмічається / видобувається, наприклад, якщо я біжу

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


pwd

/ home / myusername

tar -xvzf passwd.tar.gz

це створить / home / myusername / etc / passwd

не впевнений, що всі версії tar роблять це:

 Removing leading `/' from member names

18

Пост @amitchhajer працює для гудрону GNU. Якщо хтось знайде цю посаду і їй потрібно працювати в GNUсистемі NON , він може це зробити:

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.