我有一个包含子目录的目录,我想将其复制到另一个目录中。我目前的天真的方法是这样的:
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 {} \;
有没有更好的方法来减少冗余和减少 exec 调用?
答案1
使用 rsync 和过滤 (-f),您可以过滤目录并过滤掉其他所有内容,如下所示:
rsync -av -f "+ */" -f "- *" src_dir/ new_dir/
答案2
您可以将 更改;
为+
,find ... -exec
从而减少进程调用的次数。在这种情况下,您需要使用一小部分 shell 来展开将传入的目录列表:
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 ...