ディレクトリ構造を保って特定の拡張子のファイルだけをコピーする修行

あるディレクトリの下をディレクトリ構造を保ってコピーしたい。それだけなら cp -r でよいが元のディレクトリの下にはコピーしなくてもよい、というかコピーしたくないファイルもたくさんある。幸い、コピーしたいものは拡張子が決まっている。
元のディレクトリを /home/takeyuki/trash/box/、コピー先を /tmp/box/、コピーしたい拡張子を ".gomi" とする。コピーするついでに LF -> CR LF 変換もしてしまうことにする。その際にファイル名の拡張子も "gomi" から "txt" に変換。

src_dir=/home/takeyuki/trash/box/
dst_dir=/tmp/box/

find $src_dir -name "*.gomi" | while read s_path; do
  s_dir=${s_path%/*}
  file=${s_path##*/}
  d_dir=$dst_dir${s_dir#${src_dir}}
  if [ ! -d $d_dir ]; then
    mkdir -p $d_dir
  fi
  d_path=$d_dir/${file%.*}.txt
  unix2dos < $s_path > $d_path
done
  • find -printf "%h %f\n" なる技を知ったのだが bash の変数展開だけで済んでしまった
  • 本実行の前にちょっとテストしたいときは find と while の間に head をはさむとよい
  • 改行コード変換が必要なければ unix2dos の代わりに cp -p を