2009-07-09 10 views
2

私はbashスクリプティングに興味があり、unixディレクトリを走査して正規表現の条件に合っている場合に現在見ているファイルへのパスを記録する方法を知りたいと思っています。bashまたはPerlスクリプトを使用してディレクトリツリーをトラバースする方法はありますか?

それは次のように行くだろう:大型UNIXディレクトリ・パスファイル/フォルダ構造トラバース

  • 、現在のファイルの内容は、1つまたは複数の正規表現の表現にマッチした文字列が含まれている場合、
  • そして、結果のテキストファイルにファイルのフルパスを追加します。私はあなたがgrepをAWKなどのコマンドでbashスクリプトを使用してこれを行うだろうか好むだろうが

バッシュやPerlスクリプトは、罰金です。

答えて

5

使用のgrepに

find . -exec grep -l -e 'myregex' {} \; >> outfile.txt 

-lを見つけるとgrepはgrepの上だけで、ファイル名

-eを取得する上でfindコマンドによって発見正規表現

{}場所各ファイルを指定しますgrepコマンドの最後

>> outfile.txtテキストファイル

+0

-exec grepは、すべてのファイルに対して別々にgrepを実行するので、かなり遅くなります。 –

+0

プラス記号を使用すると、スピードアップすることができます。 -exec grep -l -e 'myregex' {} + >> outfile.txt –

2

grep -l -R <regex> <location>は仕事をする必要があります。

+0

-Rは、特定のバージョンのUnixで前に問題を抱えていました。 @Brock Woolfにはうまくいけば、そうでなければ、findとgrepを一緒に使う必要があります。 – Xetius

+0

GNU grepオプションです。彼のUNIXバージョンにそれがない場合は、インストールするのが難しくありません(政治を脇に)。 – pgs

8
find . -type f -print0 | xargs -0 grep -l -E 'some_regexp' > /tmp/list.of.files 

重要部品:

  • -type fが検索リストファイルのみになり\ nではなく0 \でない区切られたファイルを印刷し-print0
  • - それは確かにそれを作るためにここにあります
  • xargs -0 - 入力を\ 0に分割し、指定したコマンドの引数として各要素を渡します(この例ではgrep)。

xargsのを使用してクールなことは、あなたのディレクトリには、本当にたくさんのファイルが含まれている場合、あなたはそれを並列接続することにより、プロセスをスピードアップすることができ、次のとおりです。

find . -type f -print0 | xargs -0 -P 5 -L 100 grep -l -E 'some_regexp' > /tmp/list.of.files 

これは、5枚の別々のコピーにgrepコマンドを実行します、各走査最大100個のファイル

+0

私はこれが好きです。私はあなたが使いたい電力の量に応じて、あなたが望むようにコマンドを単純か複雑にすることができるという事実を愛しています。 – Xetius

0
find /path -type f -name "*.txt" | awk ' 
{ 
    while((getline line<$0)>0){ 
     if(line ~ /pattern/){ 
      print $0":"line 
      #do some other things here 
     } 
    }  
}' 

同様のthread

0
find /path -type f -name "outfile.txt" | awk ' 
{ 
    while((getline line<$0)>0){ 
     if(line ~ /pattern/){ 
      print $0":"line 
     } 
    }  
}' 
2

の別のセットあなたは、Th1をやってみたかった場合Perlの内部からの、あなたは人々が提案findコマンドを取ると、find2perlとPerlスクリプトにそれらを回すことができます:あなたが持っている場合は

$ find ... 

はその

$ find2perl ... 

を出力します同じことをするPerlプログラム。そこから、あなたがPerlで簡単だがシェルでは難しいことをする必要があれば、Perlプログラムを拡張するだけです。

関連する問題