web-dev-qa-db-ja.com

文字列を含む特定の拡張子を持つすべてのファイルを検索します

パス "./"の下に文字列 "Jason"を再帰的に含む.xmlおよび.pyの拡張子を持つすべてのファイルを再帰的に見つける方法を知りたいのですが。

または、どのようにして検索から.poを除外できますか?

5

Grepのみで(findを使用せずに)それを行うことができます:

grep --include=\*.{xml,py} -Rl ./ -e "Jason"

.poを除外するには:

grep --exclude=*.po --include=\*.{xml,py} -Rl ./ -e "Jason"
9
nobody

次のコマンドを試してください。 .xmlおよび.pyファイルでのみ名前を検索します:

find . -type f \( -iname \*.xml -o -iname \*.py \) | xargs grep "Jason"

お役に立てれば!

3
Terrance

これは、findgrepを組み合わせて行うことができます。ここに小さなデモがあります-6つのtxtファイルとrtfファイルを含むテストディレクトリがあり、そのうち2つには文字列「Jason」が含まれています。

CURRENT DIR:[/home/xieerqi/testdir]
$ find . -type f \( -iname "*.txt" -o -iname "*.rtf" \) -exec grep -iR 'jason' {} +                                        
./foo1.txt:Jason
./bar1.txt:Jason

CURRENT DIR:[/home/xieerqi/testdir]
$ ls                                                                                                                       
bar1.rtf  bar1.txt  bar2.rtf  bar2.txt  foo1.rtf  foo1.txt  foo2.rtf  foo2.txt

CURRENT DIR:[/home/xieerqi/testdir]
$ find . -type f \( -iname "*.txt" -o -iname "*.rtf" \) -exec grep -iR 'jason' {} +                                        
./foo1.txt:Jason
./bar1.txt:Jason

ここで、txtおよびrtf拡張子を持つすべてのファイルを見つけ、それらをすべてgrepのパラメーターとして指定します。 .は現在のディレクトリでの検索を意​​味しますが、別のパスを指定すると、findがそのディレクトリとサブディレクトリに降りて、再帰的に検索します。

拡張機能をあなたのものに置き換えて、最終的な答えは

find . -type f \( -iname "*.xml" -o -iname "*.py" \) -exec grep -iR 'jason' {} + 
1

おそらく最良の解決策は誰も既に提供していませんが、ツールがディレクトリの再帰的なファイル名の検索をサポートしていない場合、globstarbashオプションを有効にして再帰的なグロビングを実行できます。

shopt -s globstar; grep -F -l Jason **/*.{xml,py}
user@user-X550CL:~/tmp$ tree -a
.
└── dir1
    └── dir
        ├── containing_Jason.py
        ├── containing_Jason.txt
        ├── containing_Jason.xml
        ├── not_containing_Jason.py
        ├── not_containing_Jason.txt
        └── not_containing_Jason.xml

2 directories, 6 files
user@user-X550CL:~/tmp$ shopt -s globstar
user@user-X550CL:~/tmp$ grep -F -l Jason **/*.{xml,py}
dir1/dir/containing_Jason.xml
dir1/dir/containing_Jason.py

zshの同等の機能はデフォルトで有効になっています。

grep -F -l Jason **/*.{xml,py}
user@user-X550CL ~/tmp % tree -a                       
.
└── dir1
    └── dir
        ├── containing_Jason.py
        ├── containing_Jason.txt
        ├── containing_Jason.xml
        ├── not_containing_Jason.py
        ├── not_containing_Jason.txt
        └── not_containing_Jason.xml

2 directories, 6 files
user@user-X550CL ~/tmp % grep -F -l Jason **/*.{xml,py}
dir1/dir/containing_Jason.xml
dir1/dir/containing_Jason.py
0
kos

これを行うことができます:

grep -r "Jason" ./ | grep .xml; grep -r "Jason" ./ | grep .py

Jasonを含むファイルの出力が表示され、.xmlまたは.pyを含むファイル名に制限されます。

.poのみを除外する場合は、これを試してください:

grep -r "Jason" | grep -v .po
0
Daniel

上記の質問から私が理解する方法は、「Jason」文字列を持つすべてのファイルを表示する必要があることです。だから、これがあなたを助けることができるかもしれません:

find . -type f \( -name "*.xml" -o -name "*.py" \) | grep -r "Jason" | cut -d':' -f1 | uniq
0
Hamsternik