Я хочу скопировать мою структуру каталогов, исключая файлы. Есть ли опция в 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'