Тар только структура каталога

Я хочу скопировать мою структуру каталогов, исключая файлы. Есть ли опция в tar, чтобы игнорировать все файлы и копировать только каталоги рекурсивно.

Ответ 1

Вы можете использовать find, чтобы получить каталоги, а затем распаковать их:

find .. -type d -print0 | xargs -0 tar cf dirstructure.tar --no-recursion

Если у вас более 10000 каталогов, используйте следующие ограничения для обхода ограничений xargs:

find . -type d -print0 | tar cf dirstructure.tar --no-recursion --null --files-from -

Ответ 2

Имена каталогов, содержащие пробелы или другие специальные символы, могут потребовать дополнительного внимания. Например:

$ mkdir -p "backup/My Documents/stuff"
$ find backup/ -type d | xargs tar cf directory-structure.tar --no-recursion
tar: backup/My: Cannot stat: No such file or directory
tar: Documents: Cannot stat: No such file or directory
tar: backup/My: Cannot stat: No such file or directory
tar: Documents/stuff: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

Вот несколько вариантов обработки этих случаев "необычных" имен каталогов:

$ find backup/ -type d -print0 | xargs -0 tar cf directory-structure.tar --no-recursion

Использование -print0 с помощью find будет выдавать имена файлов в виде нулевых -T erminated строк; с -0 xargs будет интерпретировать аргументы таким же образом. Использование null в качестве терминатора помогает убедиться, что даже имена файлов с пробелами и символами новой строки будут правильно интерпретироваться.

Кроме того, можно получать результаты непосредственно от find до tar:

$ find backup/ -type d | tar cf directory-structure.tar -T - --no-recursion

Вызов tar с -T - (или --files-from -) заставит его читать имена файлов из stdin, ожидая, что каждое имя файла будет разделено разрывом строки.

Для максимального эффекта это может быть объединено с опциями для нулевых -T erminated строк:

$ find . -type d -print0 | tar cf directory-structure.tar --null --files-from - --no-recursion

Из них я считаю, что эта последняя версия является самой надежной, поскольку она поддерживает как необычные имена файлов, так и (в отличие от xargs) по своей сути не ограничена размерами командной строки системы. (см. xargs --show-limits)

Ответ 3

for i in 'find . -type d'; do mkdir -p /tmp/tar_root/'echo $i|sed 's/\.\///''; done
pushd /tmp/tar_root
tar cf tarfile.tar *
popd
# rm -fr /tmp/tar_root

Ответ 4

зайдите в папку, в которую вы хотите начать (почему мы используем find dot), сохраните файл tar в другом месте. Я думаю, что у меня возникла ошибка, оставив его там. tar с r не c. Я думаю, cf вы продолжаете создавать новые файлы, и вы получаете только последний набор подкаталогов файлов. tar r добавляется к файлу tar. --no-recursion, потому что находка дает вам весь список файлов, поэтому вы не хотите рекурсировать.

найти. -type d | xargs tar rf/somewhereelse/whatever-dirsonly.tar --no-recursion

tar tvf/somewhereelse/whatever-dirsonly.tar | больше, чтобы проверить, что вы получили.

Ответ 5

Для AIX:

tar cvfD some-tarball.tar 'find /dir_to_start_from -type d -print'