
У меня есть папка all_folders
, содержащая 5 папок:
./all_folders
./all_folders/folder1
./all_folders/folder2
./all_folders/folder3
./all_folders/folder4
./all_folders/folder5
Могу ли я сжать все эти папки одной командой сразу? Я хочу быть в all_folders
каталоге, а затем выполнить команду, чтобы сжать отдельные папки в этом каталоге.
Ожидаемый результат:
когда я делаю
ls
в all_folders
, то у меня должно быть 10 каталогов. 5 несжатых и 5 сжатых.
решение1
cd
в all_folders
, затем запустить
for i in folder1 folder2 folder3 folder4 folder5; do tar czf $i.tar.gz $i; done
решение2
Немного неясно, чего вы пытаетесь добиться. Я исхожу из варианта использования, где здесь должны сжиматься только подкаталоги.
Сначала перейдите в каталог, содержащий коллекцию каталогов, а затем:
find -maxdepth 1 -type d | {
while read dir; do
if [ ! "x${dir#*/}" = "x." ]; then
tar cJf ${dir#*/}.tar.xz ${dir#*/};
fi;
done
}
Это хорошо работает с zsh
. Чтобы проверить что-то, поместите echo
перед tar
, чтобы увидеть, проверяется ли команда и т. д.
Однако создание коллекции архивов, как это, обычно нежелательно. Обычно вы хотите либо сжать всю коллекцию, либо использовать прозрачное сжатие диска, на котором находятся эти файлы, либо использовать транспортное сжатие ( X-DEFLATE
например, с HTTP).
Пожалуйста, имейте в виду, что в итоге вы получите не «сжатый каталог», а «сжатый архив», эти вещи не являются взаимозаменяемыми, поскольку архивы сами по себе являются файлами, а каталоги — всего лишьинодыдатаграммы.
решение3
tar -zcvf archive.tar.gz directory/
Это сообщит tar создать архив из файлов в каталоге (tar по умолчанию рекурсивен), сжать его с помощью алгоритма z (gzip), сохранить вывод как af (файл) с именем archive.tar.gz и v (подробно) вывести список всех файлов, которые он добавляет в архив.
Чтобы распаковать архив в текущий каталог, используйте
tar -zxvf archive.tar.gz