ディレクトリ階層(ファイルを省略)を別のディレクトリにコピーするにはどうすればよいですか?

ディレクトリ階層(ファイルを省略)を別のディレクトリにコピーするにはどうすればよいですか?

サブディレクトリを含むディレクトリがあり、それを別のディレクトリにコピーしたいと考えています。現在の私の素朴なアプローチは次のようになります。

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、プロセス呼び出しの数を減らすことができます。この状況では、渡されるディレクトリのリストを展開するために、小さなシェルを使用する必要があります。

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

期待どおりに動作することを確認したら、 の 2 つのインスタンスを削除しますecho。(特に、 になることに注意してください。これが望ましくない場合は、代わりにこのタイプの構造を使用し、 が絶対パスとして書き換えられるdest_dir/src_dir/...ことを忘れないでください)。dest_dir

cd src_dir && find -type d ...

関連情報