Encontre arquivos filtrados por várias extensões


52

Qual é a sintaxe correta para:

find . -type f -name \*.\(shtml\|css\)

Isso funciona, mas é deselegante:

find . -type f -name \*.shtml > f.txt && find . -type f -name \*.css >> f.txt

Como fazer o mesmo, mas com menos pressionamentos de tecla?

Respostas:


75

Você pode combinar diferentes expressões de pesquisa com os operadores lógicos -orou -and, para que seu caso possa ser escrito como

find . -type f \( -name "*.shtml" -or -name "*.css" \)

Isso também mostra que você não precisa escapar de caracteres especiais do shell ao usar aspas.

Editar

Desde -ortem precedência menor do que o implícito -andentre -typee a primeira -nameparte do nome entre parênteses, conforme sugerido por Chris.


Isso também imprimirá diretórios chamados "* .css".
peluche

Hmm, os parênteses na sua versão atualizada estão um pouco equivocados. Os parênteses individuais precisam terminar como parâmetros separados para encontrar , portanto, precisam de espaços ao seu redor (`" .css ")` resulta em um único valor de string; é o mesmo que (por exemplo) `` .css) ' ). Second, the parentheses need to go around whole ‘primaries’ (the open parenthesis needs to be before -name`, não entre ele e seu' operando ').
quer

15

Aqui está uma maneira de fazer sua primeira versão:

find -type f -regex ".*/.*\.\(shtml\|css\)"

12

Você precisa colocar parênteses para incluir apenas arquivos:

find . -type f \( -name "*.shtml" -o -name "*.css" \) -print

Bônus : esta é uma sintaxe compatível com POSIX.


4

Muitas vezes, acabo usando egrep, ou pipes mais longos ou perl para filtros ainda mais complexos:

find . -type f | egrep '\.(shtml|css)$'
find . -type f | perl -lne '/\.shtml|\.css|page\d+\.html$/ and print'

Pode ser um pouco menos eficiente, mas isso geralmente não é uma preocupação e, para coisas mais complexas, geralmente é mais fácil construir e modificar.

A advertência padrão aplica-se a não usar isso para arquivos com nomes de arquivos estranhos (por exemplo, contendo novas linhas).


+1 para uma solução limpa e modular, os gargalos de desempenho geralmente ocorrem durante o processamento dos arquivos resultantes dos resultados da pesquisa.
Cristik
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.