ディレクトリ構造を保って特定の拡張子のファイルだけをコピーする修行
あるディレクトリの下をディレクトリ構造を保ってコピーしたい。それだけなら 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 を