Для каждого dir создается tar файл
У меня есть куча каталогов, которые нужно восстановить, но они должны быть сначала упакованы в .tar. Есть ли script, который позволит мне упаковать все 100 + каталогов в их собственный tar, поэтому dir станет dir.tar.
Пока что попытка:
for i in *; do tar czf $i.tar $i; done
Ответы
Ответ 1
Сценарий, который вы написали, не будет работать, если у вас есть несколько пробелов в имени каталога, потому что имя будет разделено, а также будет tar файлами, если они существуют на этом уровне.
Вы можете использовать эту команду для рекурсивного вывода списка каталогов:
find . -maxdepth 1 -mindepth 1 -type d
и этот, чтобы выполнить tar для каждого из них:
find . -maxdepth 1 -mindepth 1 -type d -exec tar cvf {}.tar {} \;
Ответ 2
У вас есть имена каталогов с пробелами в них на этом уровне? Если нет, ваш script будет работать нормально.
Обычно я пишу script с помощью команды, которую я хочу выполнить эхом:
$ for i in *
do
echo tar czf $i.tar $i
done
Затем вы можете посмотреть результат и посмотреть, делает ли он то, что вы хотите. После того, как вы определите, что программа будет работать, отредактируйте командную строку и удалите команду echo
.
Ответ 3
Если в именах каталогов есть пробелы, тогда просто поместите переменные в двойные кавычки:
for i in *
do
tar czf "$i.tar" "$i"
done
Ответ 4
если количество каталогов очень велико и их имена слишком длинны
после выполнения оператора номер один
for i in *
do
echo tar czf $i.tar $i
done
вы получите ошибку "string too long"
Ответ 5
Выполните их все просто и параллельно с помощью GNU Parallel:
parallel tar -cf {}.tar {} ::: *
Если вы хотите проверить, что он собирается делать, фактически ничего не делая, добавьте --dry-run
следующим образом:
parallel --dry-run tar -cf {}.tar {} ::: *
Пример вывода
tar -cf ab.tar ab
tar -cf cd.tar cd