パス "./"の下に文字列 "Jason"を再帰的に含む.xml
および.py
の拡張子を持つすべてのファイルを再帰的に見つける方法を知りたいのですが。
または、どのようにして検索から.po
を除外できますか?
Grepのみで(findを使用せずに)それを行うことができます:
grep --include=\*.{xml,py} -Rl ./ -e "Jason"
.poを除外するには:
grep --exclude=*.po --include=\*.{xml,py} -Rl ./ -e "Jason"
次のコマンドを試してください。 .xml
および.py
ファイルでのみ名前を検索します:
find . -type f \( -iname \*.xml -o -iname \*.py \) | xargs grep "Jason"
お役に立てれば!
これは、find
とgrep
を組み合わせて行うことができます。ここに小さなデモがあります-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' {} +
おそらく最良の解決策は誰も既に提供していませんが、ツールがディレクトリの再帰的なファイル名の検索をサポートしていない場合、globstar
のbash
オプションを有効にして再帰的なグロビングを実行できます。
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
これを行うことができます:
grep -r "Jason" ./ | grep .xml; grep -r "Jason" ./ | grep .py
Jason
を含むファイルの出力が表示され、.xml
または.py
を含むファイル名に制限されます。
.po
のみを除外する場合は、これを試してください:
grep -r "Jason" | grep -v .po
上記の質問から私が理解する方法は、「Jason」文字列を持つすべてのファイルを表示する必要があることです。だから、これがあなたを助けることができるかもしれません:
find . -type f \( -name "*.xml" -o -name "*.py" \) | grep -r "Jason" | cut -d':' -f1 | uniq