%20%D0%B2%20%D0%B4%D1%80%D1%83%D0%B3%D0%BE%D0%B9%20%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%3F.png)
У меня есть каталог с подкаталогами, которые я хотел бы скопировать в другой каталог. Мой текущий наивный подход такой:
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 ...