Как скопировать иерархию каталогов (исключая файлы) в другой каталог?

Как скопировать иерархию каталогов (исключая файлы) в другой каталог?

У меня есть каталог с подкаталогами, которые я хотел бы скопировать в другой каталог. Мой текущий наивный подход такой:

find src_dir -type d -exec mkdir -p dest_dir/{} \;

Он работает, но делает много лишних mkdirвызовов, да еще и в определенной последовательности.

Попробовал также вот эти для справки:

# real fast
find src_dir -type d >/dev/null
# also real fast
find src_dir -type d -exec true {} +
# slower, but not as slow as mkdir
find src_dir -type d -exec true {} \;

Есть ли лучший способ с меньшей избыточностью и меньшим количеством звонков руководству?

решение1

Используя rsync и фильтрацию (-f), вы можете отфильтровать каталоги и отфильтровать все остальное, например так:

rsync -av -f "+ */" -f "- *" src_dir/ new_dir/

решение2

Вы можете изменить ;на +для find ... -exec, уменьшив количество вызовов процесса. В этой ситуации вам нужно использовать небольшой кусок оболочки, чтобы развернуть список каталогов, которые будут переданы:

find src_dir -type d -exec bash -c 'echo cd "$0" && echo mkdir -p "$@"' dest_dir {} +

Удалите два случая, echoкогда вы уверены, что все будет работать так, как и ожидалось. (Обратите особое внимание, что в итоге вы получите dest_dir/src_dir/...; если вы этого не хотите, используйте вместо этого конструкцию такого типа, не забыв убедиться, что dest_dirона переписана как абсолютный путь):

cd src_dir && find -type d ...

Связанный контент