encontrar e negação de uma condição -iname

4

Estou tentando encontrar todos os arquivos que têm 'pilar' no nome (incentivo de caso) e não contêm 'cache' (também não diferencia maiúsculas de minúsculas) com

find . -iname '*pillar*' -and -not -iname '*cache*'

mas não funciona como eu acho (entre outros)

./Caches/Metadata/Safari/History/https:%2F%2Fwww.google.ch%2Fsearch?q=pillars+of+eternity+dropbox&client=safari&rls=en&biw=1440&bih=726&ei=CnBDVbhXxulSnLaBwAk&start=10&sa=N%23.webhistory

O que estou fazendo de errado?

    
por Matteo 10.06.2015 / 14:28

2 respostas

6

Parece que você quer evitar procurar arquivos em *cache* diretórios mais do que encontrar arquivos com *pillar* e não *cache* em seus nomes. Então, apenas diga find para não se incomodar em descer em *cache* diretórios:

find . -iname '*cache*' -prune -o -iname '*pillar*' -print

Ou com zsh -o extendedglob :

ls -ld -- (#i)(^*cache*/)#*pillar*

(não estritamente equivalente, pois isso informaria um arquivo foo/pillar-cache )

Ou (menos eficiente à medida que desce a árvore inteira como na @solução do apaul ):

ls -ld -- (#i)**/*pillar*~*cache*

Detalhes sobre os globs específicos de zsh :

  • (#i) : ative a correspondência insensível a maiúsculas e minúsculas
  • ^ : operador glob de negação
  • (...) : agrupamento (como @(...) em ksh ).
  • <something># : zero ou mais de <something> (como * em regexps).
  • ~ : e não operador (corresponde ao caminho completo)
  • **/ : 0 ou mais níveis de diretório (abreviação de (*/)# ).

Adicione o qualificador (D) glob se você quiser descer em diretórios ocultos e corresponder arquivos ocultos, como na find solution.

    
por 10.06.2015 / 14:47
6

As opções find que você especificou aplicam-se ao nome do arquivo, não ao nome dos subdiretórios.

Aqui, o nome do seu arquivo não contém cache , mas contém pillar , então corresponde.

No seu caso, você pode querer usar a opção -path . Algo como:

find . -iname '*pillar*' -and -not -ipath '*cache*'
    
por 10.06.2015 / 14:39

Tags