2

私は bash スクリプトに興味があり、正規表現の条件に一致する場合に、UNIX ディレクトリをトラバースし、現在見ているファイルへのパスをログに記録する方法を知りたいです。

次のようになります。

  • 大規模な UNIX ディレクトリ パス ファイル/フォルダー構造をトラバースします。
  • 現在のファイルの内容に 1 つ以上の正規表現に一致する文字列が含まれている場合、
  • 次に、ファイルのフル パスを結果テキスト ファイルに追加します。

Bash または Perl スクリプトは問題ありませんが、grepawkなどのコマンドで bash スクリプトを使用してこれを行う方法をお勧めします。

4

6 に答える 6

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

重要な部分:

  • -タイプfは、検索リストをファイルのみにします
  • -print0は、\nではなく\0で区切られたファイルを出力します-名前にスペースが含まれるファイルがある場合に機能することを確認するためにここにあります
  • xargs-0-入力を\0に分割し、各要素を引数として指定したコマンド(この例ではgrep)に渡します。

xargsを使用することのすばらしい点は、ディレクトリに本当に多くのファイルが含まれている場合、それを並列化することでプロセスを高速化できることです。

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

これにより、grepコマンドが5つの別々のコピーで実行され、それぞれが最大100ファイルの別のセットをスキャンします。

于 2009-07-09T10:16:35.763 に答える
5

find と grep を使用する

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

-lgrepでファイル名だけを取得します

-egrep で正規表現を指定します

{}find コマンドで見つかった各ファイルを grep コマンドの末尾に配置します

>> outfile.txtテキストファイルに追加します

于 2009-07-09T09:40:46.583 に答える
2

Perl 内からこれを行いたい場合はfind、人々が提案したコマンドを使用して、次のコマンドを使用して Perl スクリプトに変換できますfind2perl

あなたが持っている場合:

$ find ...

それを作る

$ find2perl ...

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

于 2009-07-10T15:36:46.087 に答える
2

grep -l -R <regex> <location>仕事をするべきです。

于 2009-07-09T09:42:23.587 に答える
0
find /path -type f -name "*.txt" | awk '
{
    while((getline line<$0)>0){
        if(line ~ /pattern/){
            print $0":"line
            #do some other things here
        }
    }    
}'

類似のスレッド

于 2009-07-09T11:27:32.280 に答える
0
find /path -type f -name "outfile.txt" | awk '
{
    while((getline line<$0)>0){
        if(line ~ /pattern/){
            print $0":"line
        }
    }    
}'
于 2009-07-09T11:28:48.207 に答える