Encontre todos os arquivos com extensões específicas que contenham uma string

5

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?

    
por Jonathan Solorzano 28.09.2015 / 20:06

6 respostas

9

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"
    
por nobody 28.09.2015 / 20:32
3

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!

    
por Terrance 28.09.2015 / 20:30
1

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' {} + 
    
por Sergiy Kolodyazhnyy 28.09.2015 / 20:33
0

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
    
por Daniel 28.09.2015 / 20:11
0

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
    
por Hamsternik 28.09.2015 / 20:39
0

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
    
por kos 28.09.2015 / 21:53