IBM AIX find src_dir -type d -exec mkdir -p "dst_dir/{}" \; 動作しません。

IBM AIX find src_dir -type d -exec mkdir -p

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)

おすすめ記事