如何将目录层次结构(省略文件)复制到不同的目录中?

如何将目录层次结构(省略文件)复制到不同的目录中?

我有一个包含子目录的目录,我想将其复制到另一个目录中。我目前的天真的方法是这样的:

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 ...

相关内容