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