find して テキストにフィルタして

最近よく使うようになったのが以下のようなスクリプト

for i in `find directoryA -name '*.html'`
do
  dn=`dirname $i`
  bn=`basename $i`
  nd=directoryB/${dn#directoryA/}
  [ -d $nd ] || mkdir -p $nd
  cat $i | perl -nlpe 'フィルタするperlスクリプト' > $nd/$bn
done

とか、

for i in `grep -r '検索文字列' directoryA`
do
  dn=`dirname $i`
  bn=`basename $i`
  nd=directoryB/${dn#directoryA/}
  [ -d $nd ] || mkdir -p $nd
  cat $i | perl -nlpe 'フィルタするperlスクリプト' > $nd/$bn
done

directoryA の中で条件にマッチしたファイルを取得してきて、変換してdirectoryBに同じディレクトリ構造でperlでフィルタした結果を作成する。

  • dn は DirectoryName
    • direname コマンドは 引数に渡したファイルパスからディレクトリのパスを取得する。
  • bn は BaseName
    • basename コマンドは 引数に渡したファイルパスからファイル名だけを取得する
  • nd は NewDirectory
    • $nd/$bn は 新しいディレクトリ構造のファイルパスを表す

あとはディレクトリごとdiffツールで比較して、間違いないかどうかチェック。