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?
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:
Você pode combinar diferentes expressões de pesquisa com os operadores lógicos -or
ou -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 -or
tem precedência menor do que o implícito -and
entre -type
e a primeira -name
parte do nome entre parênteses, conforme sugerido por Chris.
). Second, the parentheses need to go around whole ‘primaries’ (the open parenthesis needs to be before
-name`, não entre ele e seu' operando ').
Aqui está uma maneira de fazer sua primeira versão:
find -type f -regex ".*/.*\.\(shtml\|css\)"
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).