Копировать структуру папок (без файлов) из одного места в другое - PullRequest
74 голосов
/ 02 ноября 2010

Я хочу создать клон структуры нашего многотерабайтного файлового сервера. Я знаю, что cp --parents может перемещать файл и его родительскую структуру, но есть ли способ скопировать структуру каталога без изменений?

Я хочу скопировать в систему linux, и наш файловый сервер там смонтирован CIFS.

Ответы [ 13 ]

133 голосов
/ 02 ноября 2010

Вы можете сделать что-то вроде:

find . -type d >dirs.txt

, чтобы создать список каталогов, затем

xargs mkdir -p <dirs.txt

, чтобы создать каталоги в месте назначения.

67 голосов
/ 02 ноября 2010
cd /path/to/directories &&
find . -type d -exec mkdir -p -- /path/to/backup/{} \;
21 голосов
/ 30 августа 2017

Вот простое решение с использованием rsync:

rsync -av -f"+ */" -f"- *" "$source" "$target"
  • одна строка
  • нет проблем с пробелами
  • сохранить разрешения

Я нашел это решение там

6 голосов
/ 02 ноября 2010

Не знаю, если вы ищете решение для Linux.Если это так, вы можете попробовать это:

$ mkdir destdir
$ cd sourcedir
$ find . -type d | cpio -pdvm destdir
4 голосов
/ 27 декабря 2015

Копирует атрибуты каталогов и файлов, но не данные файлов:

cp -R --attributes-only SOURCE DEST

Затем вы можете удалить атрибуты файлов, если они вам не интересны:

find DEST -type f -exec rm {} \;
2 голосов
/ 04 июня 2015

Это работает:

find ./<SOURCE_DIR>/ -type d | sed 's/\.\/<SOURCE_DIR>//g' | xargs -I {} mkdir -p <DEST_DIR>"/{}"

Просто замените SOURCE_DIR и DEST_DIR.

1 голос
/ 18 декабря 2017

Это решает даже проблему с пробелами:

В исходном / исходном каталоге:

find . -type d -exec echo "'{}'" \; > dirs2.txt

, затем воссоздайте его во вновь созданном каталоге:

mkdir -p <../<SOURCEDIR>/dirs2.txt
1 голос
/ 22 июля 2013

Следующее решение хорошо работает для меня в различных средах:

sourceDir="some/directory"
targetDir="any/other/directory"

find "$sourceDir" -type d | sed -e "s?$sourceDir?$targetDir?" | xargs mkdir -p
1 голос
/ 01 сентября 2012

Замените target_dir и source_dir соответствующими значениями:

cd target_dir && (cd source_dir; find . -type d ! -name .) | xargs -i mkdir -p "{}"

Проверено на OSX + Ubuntu.

0 голосов
/ 13 мая 2019

Другой подход - использовать tree, который довольно удобен и перемещается по деревьям каталогов на основе его сильных опций. Есть опции только для каталогов, исключать пустые каталоги, исключать имена с шаблоном, включать только имена с шаблоном и т. Д. man tree

Преимущество : вы можете редактировать или просматривать список, или если вы делаете много сценариев и часто создаете пакет пустых каталогов

Подход : создайте список каталогов, используя tree, используйте этот список в качестве аргумента для ввода mkdir

tree -dfi --noreport > some_dir_file.txt

-dfi перечисляет только каталоги, печатает полный путь для каждого имени, заставляет дерево не печатать строки отступа,

--noreport Позволяет печатать отчет о файле и каталоге в конце списка дерева, просто чтобы выходной файл не содержал пуха

Затем перейдите к месту назначения, где вы хотите пустые каталоги, и выполните

xargs mkdir < some_dir_file.txt
...