
src_dirからdst_dirにディレクトリ構造をコピーしようとしています。
私のCentOS 6.4 Linux Bashでは、このコマンドは正しく実行されます。
[localhost]$ find src_dir
src_dir
src_dir/dir2
src_dir/dir2/dir4
src_dir/dir1
src_dir/dir1/test.txt
src_dir/dir1/dir3
[localhost]$ find src_dir -type d -exec mkdir -p "dst_dir/{}" \;
[localhost]$ find dst_dir
dst_dir/src_dir
dst_dir/src_dir/dir2
dst_dir/src_dir/dir1
dst_dir/src_dir/dir1/dir3
ただし、IBM AIX 6.1 で同じコマンドを実行すると、次の出力が表示されます。
[aix61:/data]find dst_dir
dst_dir
dst_dir/{}
AIXでは、「find」コマンド・パラメーター{}の置換が若干異なる場合があります。
しかし、どのように解決するのかわかりません。どんなアドバイスでも役に立ちます。
答え1
はい、構文はPOSIXではありません。{}
独自のパラメータに応じて、スタンドアロンのみの拡張が保証されます。
使用:
find src_dir -type d -exec sh -c 'for dir do
mkdir -p "dst_dir/$dir"; done' sh {} +
または、mkdir
ディレクトリごとに1つずつ実行しないでください。
find src_dir -type d -exec sh -c 'for dir do
set -- "$@" "dst_dir/$dir"; shift; done
mkdir -p "$@"' sh {} +
(「引数リストが大きすぎる」という条件が発生する危険がありますが)。
dst_dir/src_dir/x/y...
必要に応じて、次の操作を行いdst_dir/x/y...
ます。
find src_dir -type d -exec sh -c 'for dir do
set -- "$@" "dst_dir${dir#src_dir}"; shift; done
mkdir -p "$@"' sh {} +
ディレクトリパスに改行文字が含まれていないことを保証できる場合は、他のオプションは以下を使用することですpax
。
find src_dir -type d | pax -rw dst_dir
-pe
これにより、所有権や権限などのディレクトリメタデータをコピーできます(
src_dir
ターゲットから先行コンポーネントを削除するには、次のようにします。
find src_dir -path '*/*' -type d | pax -'s@^src_dir/@@' -rw dst_dir
または:
(cd src_dir && find . -type d | pax -rw ../dst_dir)