Você pode fazer isso apenas com o grep (sem usar o find):
grep --include=\*.{xml,py} -Rl ./ -e "Jason"
E para excluir .po:
grep --exclude=*.po --include=\*.{xml,py} -Rl ./ -e "Jason"
Gostaria de saber como encontrar todos os arquivos cuja extensão pode ser .xml
e .py
que contêm a string "Jason" em um caminho "./" de forma recursiva?
Ou como posso excluir .po
da pesquisa?
Você pode fazer isso apenas com o grep (sem usar o find):
grep --include=\*.{xml,py} -Rl ./ -e "Jason"
E para excluir .po:
grep --exclude=*.po --include=\*.{xml,py} -Rl ./ -e "Jason"
Tente o seguinte comando. Ele pesquisará somente nos arquivos .xml
e .py
do seu nome:
find . -type f \( -iname \*.xml -o -iname \*.py \) | xargs grep "Jason"
Espero que isso ajude!
Isso pode ser feito combinando find
e grep
. Aqui está uma pequena demonstração - eu tenho diretório de teste com 6 arquivos txt e rtf, dois dos quais contêm string "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
Encontramos todos os arquivos com as extensões txt e rtf aqui e os damos como parâmetros para o grep. O .
significa procurar no diretório atual, mas você pode especificar outro caminho e find
irá descer para esse diretório e subdiretórios para pesquisar recursivamente.
Substituindo extensões pela sua, a resposta final é
find . -type f \( -iname "*.xml" -o -iname "*.py" \) -exec grep -iR 'jason' {} +
Você pode fazer isso:
grep -r "Jason" ./ | grep .xml; grep -r "Jason" ./ | grep .py
Isso exibirá a saída de todos os arquivos que contêm Jason
e os limitará a nomes de arquivos que contenham .xml
ou .py
.
Se você quiser apenas excluir .po
, tente o seguinte:
grep -r "Jason" | grep -v .po
Como eu entendo a sua pergunta acima, você precisa mostrar todos os arquivos com a string "Jason" em. Então, pode ser que isso possa ajudar você:
find . -type f \( -name "*.xml" -o -name "*.py" \) | grep -r "Jason" | cut -d':' -f1 | uniq
A melhor solução provavelmente já foi dada por ninguém, no entanto, quando a ferramenta não suporta procurar um diretório recursivamente por nomes de arquivos, é possível habilitar a opção globstar
de bash
e executar uma globalização recursiva:
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
O recurso equivalente em zsh
é ativado por padrão:
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
Tags command-line find files