Подтвердить что ты не робот

Для каждого dir создается tar файл

У меня есть куча каталогов, которые нужно восстановить, но они должны быть сначала упакованы в .tar. Есть ли script, который позволит мне упаковать все 100 + каталогов в их собственный tar, поэтому dir станет dir.tar.

Пока что попытка:

for i in *; do tar czf $i.tar $i; done
4b9b3361

Ответ 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