Eu estava tentando obter uma lista de todos os arquivos Python e HTML em um diretório com o comando find Documents -name "*.{py,html}"
.
Então veio a página de manual:
As chaves dentro do padrão ('{}') não são consideradas especiais (ou seja, localize. -Name 'foo {1,2}' corresponde a um arquivo chamado foo {1,2}, não aos arquivos foo1 e foo2.
Como isso faz parte de uma cadeia de tubulação, eu gostaria de poder especificar quais extensões ela corresponde no tempo de execução (sem codificação). Se o find não puder fazê-lo, um liner perl (ou similar) seria bom.
Edit: A resposta que acabei encontrando inclui todos os tipos de porcaria, e é um pouco longa também, então eu a publiquei como resposta à coceira original que estava tentando arranhar. Sinta-se livre para hackear isso se você tiver melhores soluções.
locate
, embora com a ressalva de que a atualização internab pode não estar atualizada. Mas é rápido.Respostas:
Use
-o
, que significa "ou":Você precisaria criar essa linha de comando programaticamente, o que não é tão fácil.
Você está usando o bash (ou Cygwin no Windows)? Se você é, deve poder fazer o seguinte:
o que pode ser mais fácil de construir programaticamente.
fonte
**
pesquisa recursiva; O Bash suporta apenas nas versões 4.0 e posteriores, e somente comshopt -s globstar
.-name
s entre colchetes, se estiver usando-exec
. Por exemplofind Documents \( -name "*.py" -o -name "*.html" \) -exec file {} \;
-print0
para lidar com nomes de arquivos com espaços.Algumas edições do find, principalmente nos sistemas linux, possivelmente em outros, também suportam as opções -regex e -regextype, que encontram arquivos com nomes correspondentes ao regex.
por exemplo
deve fazer o truque no exemplo acima. No entanto, essa não é uma função de localização POSIX padrão e depende da implementação.
fonte
find . -regex ".*\.\(py\|html\)$"
isso funciona porque encontra padrões para expressões regulares no estilo Emacs, que são ligeiramente diferentes, para que você não precise especificar o regextype.-regextype posix-egrep
é útil (caso contrário, você precisará escapar de muitos caracteres). Este é o comando find eu usei para um dist-hook construção de um zip distribuição do Windows (encontra os arquivos para a mudança e em arquivo muda-los para dos-EOL):find -regextype posix-egrep -regex ".*(\.([chyl]|def|cpy|cob|conf|cfg)|(README|ChangeLog|AUTHORS|ABOUT-NLS|NEWS|THANKS|TODO|COPYING.*))$" -exec sed -i -e 's/\r*$/\r/' {} \;
Você pode adicionar programaticamente mais
-name
cláusulas, separadas por-or
:Ou escolha um loop simples:
fonte
*.py
arquivos ou você tem uma versão estranha dofind
. O comando listado acima funciona muito bem.-iname
. Ele retorna os*.py
arquivos apenas se gravá-los na última posição (assiminame *.html
como a primeira expressão) . Eu uso o comando no Debian.Isso encontrará todos os arquivos .c ou .cpp no linux
Você não precisa dos parênteses escapados, a menos que esteja fazendo alguns mods adicionais. Aqui, na página de manual, eles estão dizendo se o padrão corresponde, imprima-o. Talvez eles estejam tentando controlar a impressão. Nesse caso, a impressão-atua como uma condicional e se torna uma condição "AND'd". Isso impedirá a impressão de qualquer arquivo .c.
Mas se você gostar da resposta original, poderá controlar a impressão. Isso encontrará todos os arquivos .c também.
Um último exemplo para todos os arquivos de origem c / c ++
fonte
Eu tive uma necessidade semelhante. Isso funcionou para mim:
fonte
()
find -name "*.cpp" -o -name "*.c" -o -name "*.cc" -print0
tive que usar um par de parênteses para agrupe o segundo ou operador.find -name "*.cpp" -o \( -name "*.c" -o -name "*.cc" \) -print0
Pode ser que o -print0, que é sempre "verdadeiro", tenha afetado a lógica.Meu padrão foi:
find -type f | egrep -i "*.java|*.css|*.cs|*.sql"
Como a
find
execução menos intencional do processo por Brendan Long e Stephan202 et al .:fonte
egrep
regexp. Em vez disso, você tem um shell glob onde um regexp deve ser usado. (Além disso, ofind
uso típico éfind {directory} [options...] [action]
:, onde, dependendo de impl,directory
pode usar.
comoaction
padrão-print
, mas serei explícito.) Portanto, use algo como:find . -type f -print | egrep -i '\.java$|\.css$|\.cs$|\.sql$'
Mas também, como uma alternativa muito rápidafind
, pode-se também tentelocate
de forma semelhante (embora não necessariamente até à data, uma vez que consulta um db interno para uma lista de arquivos)simples, mas funciona :)
fonte
Eu precisava remover todos os arquivos em diretórios filhos, exceto alguns arquivos. O seguinte funcionou para mim (três padrões especificados):
fonte
As chaves dentro do padrão
\(\)
são necessárias para o padrão de nome comor
Embora para o padrão de nome com o
and
operador não seja necessáriofonte
Isso funciona no AIX Korn Shell.
Ele está procurando
*.cbl
ou*.dms
com 1 dia de idade, apenas no diretório atual, pulando os subdiretórios.fonte
fonte
A respeito
Ele lista todos os arquivos que terminam com .py ou .html nos nomes de arquivos
fonte