Чи можу я застебнути всю папку за допомогою gzip?


407

Я намагаюся застебнути папку в unix. Це можна зробити за допомогою команди gzip?


6
Ви можете використовувати, gzip -r myfolderякі будуть gzip-файли рекурсивно. Так само ви можете розпаковувати файли, використовуючи gunzip -r myfolder які буде розпаковувати файли рекурсивно. Для отримання додаткової інформації man gzip
Валентин Байрамі

12
Використання tar; він підтримує варіанти стиснення. gzipрозроблений як доповнення tar, а не як заміна.
devnull

13
Зауважте, що пропозиція @ val0x00ff майже точно не є тим, що ви хочете досягти.
Шадур

4
@Shadur тому я опублікував це так, commentоскільки це не було відповіддю на його запитання.
Валентин Байрамі

2
Демонструвати, що означає @Shadur. Дано файли 1та 2під папку playground. gzip -r ./playgroundдасть вам 1.gzі 2.gz(і не більше, 1а 2файли) під папку playground, а не заархівований файл із усім, що в ньому.
Джефф Сяо

Відповіді:


660

Немає.

В відміну zip, gzipфункціонує в якості алгоритму стиснення тільки .

З - за різних причин , деякі з яких слухати назад в епоху стрічкових накопичувачів, Unix використовує програму під назвою tarархівувати дані, які потім можуть бути стиснутий за допомогою програми стиснення , як gzip, bzip2, 7zipі т.д.

Для того, щоб "зафіксувати" каталог, була б правильна команда

tar -zcvf archive.tar.gz directory/ 

Це буде сказати , tarщоб

  • стиснути його за допомогою алгоритму z (gzip)

  • c (створити) архів із файлів у directory( tarрекурсивний за замовчуванням)

  • v (багатослівний) список (on / dev / stderr, щоб він не впливав на трубопровідні команди) усі файли, які він додає до архіву.

  • і збережіть вихід у вигляді f (файл) з ім'ямarchive.tar.gz

tarКоманда пропонує gzipпідтримку ( з допомогою -zпрапора) виключно для вашої зручності. gzipКоманда / Бібліотека повністю відокремлена. Наведена вище команда фактично така ж, як і

tar -cv directory | gzip > archive.tar.gz

Для розпакування та розпакування архіву в поточний каталог, який ви б використали

tar -zxvf archive.tar.gz

Ця команда фактично така сама, як і

gunzip < archive.tar.gz | tar -xv

tarмає багато, багато, МНОГО інших варіантів та використання; Я від душі рекомендую коли-небудь прочитати його сторінку.


51
Просто щоб зробити речі ще більш явними, це саме рівнозначно tar -cv directory | gzip > archive.tar.gz. Отриманий архів можна потім витягти за допомогою tar -zxvfабо навіть zcat file.tar.gz | tar -xv. Зважаючи на те, що tar абсолютно не залежить від gzip, tarкоманда просто включає підтримку gzip для зручності.
Патрік

я використовую tar cvzfдосить довгий час. одне, що слід зазначити: якщо 7-zipдля розпакування *.tar.gzфайлу використовується Windows ( уточнюється) , це потребує двох раундів. Один для розпакування *.tar.gzфайлу у *.tarфайл, наступний - для розпакування цього файлу tar у вихідний вміст. це збільшує загальний час розпакування, особливо для великих файлів (наприклад, журналів)
Jeff Xiao

1
Чи впливає найменування архіву на щось машинне? Я знаю, що було б непогано повідомити людям алгоритм, який спочатку використовувався для його поштового зв’язку (звідси .gz), але крім цього, це насправді важливо, як ви називаєте архів?
hello_there_andy

3
@hello_there_andy Більшість Unix не має жодних змін, але Windows (і розумне завершення вкладок у Linux) робить припущення на основі розширення імені файлу.
Шадур

1
@vadimkotov Це може бути те, що ви шукаєте: superuser.com/questions/168749/…
Shadur

47

gzipКоманда не буде рекурсивно стиснути папку в один поштовий файл, при використанні -rперемикача. Швидше він буде ходити по цій структурі каталогів і копіювати кожен файл, який він знайде, в окремий файл.

Приклад

раніше

$ tree dir1/
dir1/
|-- dir11
|   |-- file11
|   |-- file12
|   `-- file13
|-- file1
|-- file2
`-- file3

тепер запустіть gzipкоманду

$ gzip -r dir1

після

$ tree dir1/
dir1/
|-- dir11
|   |-- file11.gz
|   |-- file12.gz
|   `-- file13.gz
|-- file1.gz
|-- file2.gz
`-- file3.gz

Якщо ви хочете скопіювати структуру каталогу, ви, ймовірно, захочете скористатися tarкомандою, а потім стисніть отриманий .tarфайл.

$ tar zcvf dir1.tar.gz dir1/

Приклад

$ tar zcvf dir1.tar.gz dir1/
dir1/
dir1/file1
dir1/file2
dir1/dir11/
dir1/dir11/file11.gz
dir1/dir11/file12.gz
dir1/dir11/file13.gz
dir1/file3

У результаті виходить такий один файл:

$ ls -l | grep tar
-rw-rw-r-- 1 saml saml  271 Oct  1 08:07 dir1.tar.gz

Ви можете підтвердити його вміст:

$ tar ztvf dir1.tar.gz 
drwxrwxr-x saml/saml         0 2013-10-01 08:05 dir1/
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file1
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file2
drwxrwxr-x saml/saml         0 2013-10-01 08:04 dir1/dir11/
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file11.gz
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file12.gz
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file13.gz
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file3

4

Я написав ці 2 команди:

gzipdir:

#!/bin/bash
if [[ -d $1 ]]; then
    cd "$1"
    cd ..
    base=$(basename "$1")
    tar -zcvf "$base.tgz" "$base"
    if [[ $? == 0 && -f "$base.tgz" ]]; then
        rm -rf "$base"
    fi
else
    echo "Usage: $0 DIRECTORY";
fi

ungzipdir:

#!/bin/bash
if [[ -f $1 ]]; then
    base=${1%%.*}
    file=$(basename "$1");
    dir=$(basename "$base");
    if [[ ! -d $base ]]; then
        mkdir "$base"
        cd "$base"
        cd ..
        tar -xvf "$file"
        if [[ $? == 0 && -d "$dir" ]]; then
            rm -f "$file"
        fi
    else
        echo "Directory $base already exists. Nothing done."
    fi
else
    echo "Usage: $0 file.tgz";
fi

(!!!) Будь ласка, протестуйте перед використанням (оскільки є 'rm -f', який потенційно може видалити важливі дані, якщо використовується нечасто).

Як користуватись:

cd /home/; gzipdir MyDirectory або gzipdir /home/MyDirectory

Створить /home/MyDirectory.tgz та видалить MyDirectory на успіх (!!!).

ungzipdir /home/MyDirectory.tgz

Створить / home / MyDirectory та видалить /home/MyDirectory.tgz з успіхом.


Щоб зібрати всі файли в каталозі: find ./* -maxdepth 0 -type d -exec gzipdir {} \; (будьте обережні з командою find, -exec echo {}спершу протестуйте його та переконайтеся, що ви не захоплюєте "./", що запустить каталог PARENT, можливо, зламаючи весь ваш домашній dir)
andrew lorien

1

Я рекомендую використовувати pigz( Паралельна реалізація GZip )

tar -cvf - dir | pigz -9 > /path/to/dir.tar.gz


Я також дуже багато його використовую (і pixz), але чи спрацьовує він, коли труби та перенаправлення виводу вступають у гру?
Майкл Вольф

1

Відповідь на питання "Чи можу я зашпаркувати всю папку за допомогою zip на Linux?" - це використовувати синтаксис:

zip -r <zip file name> <folder to zip>

Якщо у вас є нове запитання, будь ласка, задайте його, натиснувши кнопку Задати питання . Додайте посилання на це питання, якщо це допомагає надати контекст. - З огляду
Джефф Шаллер

2
@JeffSchaller: це відповідь. Це страшно неправильно (я вважаю), але це явно є відповіддю.
Скотт

1
@ize: Я впевнений, що команда, яку ви опублікували, насправді не використовує gzip.
даг

1
Окуляри використання zip, як поставлене запитання, швидше за все, автору хотілося б знати, що це можливо зробити саме те, що він робив у Windows. Сумно, що більшість людей не хочуть думати про це далеко.
Флоріан Хейгл

2
Це складно, коли питання вказує ... "за допомогою gzip".
Jeff Schaller

1

Для повноти, якщо ви хочете націлити файл на задньому плані, використовуйте відповідь @ Shadur і додайте &в кінці:

tar -zcvf archive.tar.gz directory/ &

0

Якщо ваш linux tar не підтримує цю -zопцію, ви можете скористатися наступним:

tar -cvf - dir | gzip > dir.tar.gz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.