Страницы

Поиск по вопросам

четверг, 2 апреля 2020 г.

Как заархивировать все папки в текущем каталоге, кажую в отдельный архив

#linux #tar

                    
Например имеем в текущем каталоге папки 001,002,003.

На выходе надо иметь три архива 001.tar.gz, 002.tar.gz, 003.tar.gz
    


Ответы

Ответ 1



может не самое элегантное, но хорошо работающее решение: find . -type d -maxdepth 1 -mindepth 1| xargs -i tar -cvzf {}.tar.gz {} объясняю что происходит: 1) find . -type d -maxdepth 1 -mindepth 1 find — утилита для поиска и обхода файлов и директорий . — текущий каталог -type d — ключ для обхода только директрий в текущем каталоге -maxdepth 1 -mindepth 1 — глубина обхода после этого на stdout у нас подаются адреса каталогов которые нужно архивировать 2) | xargs -i tar -cvzf {}.tar.gz {} | — конвейер. переваёт вывод поманды в следующую команду xargs — утилита, помогающая формировать список аргументов -i — ключ,который говорит что мы будем что-то подставлять tar -cvzf {}.tar.gz {} — команда для архивации каталога по gz(вместо {} подставляется имя каталога, сформированное утилитой find). -{}.tar.gz — имя архива(каталог+"tar.gz") вторые {} — что директория для архивации после этого в текущем каталоге у тебя появятся нужные тебе архивы , которые ты запросто можешь переместить в нужную тебе директорию командой: find . -type f| grep tar.gz | xargs -i mv {} нужная/папка

Ответ 2



очевидно, что надо «пройтись» в цикле по всем именам каталогов, и для каждого из них вызвать программу tar с соответствующими аргументами. цикл. что-нибудь вроде: $ for n in *; do test -d $n && команда; done здесь test -d имя — вернёт истину, если имя является каталогом. соответствующие аргументы — это что-нибудь вроде: tar -czf имя.tgz имя итого: $ for n in *; do test -d $n && tar -czf $n.tgz $n; done возможный недостаток: под маску * (по умолчанию) не подпадут файлы/каталоги, имена которых начинаются с символа . (точка). альтернативным способом организации цикла может служить вызов программы find либо в связке с программой xargs: $ find -mindepth 1 -maxdepth 1 -type d | xargs -I '{}' tar -czf '{}'.tgz '{}' либо с помещением нужной команды в «тело» опции -exec: $ find -mindepth 1 -maxdepth 1 -type d -exec tar -czf '{}'.tgz '{}' \;

Комментариев нет:

Отправить комментарий