Como posso excluir um diretório ao usar o find

6

Estou tentando usar o comando find no Unix e sei como usar o básico dele. Por exemplo, tenho quatro pastas, A, B, C e D. Em cada pasta, tenho um arquivo chamado hi.dat . Para procurar em todas as pastas, eu faria:

find * -name hi.dat .

Ótimo! Mas agora, e se eu não quiser ver a pasta D? Posso tentar algo como:

find * not D/* -name hi.dat ?

Eu não quero digitar:

find A/* B/* C/* -name ... porque obviamente tenho mais de três pastas e estas foram usadas apenas como exemplo.

Obrigado! Amit

    
por Amit 17.03.2011 / 22:30

4 respostas

11

No Bash:

shopt -s extglob
find !(D) -name hi.dat

Ksh e zsh funcionam de maneira semelhante.

    
por 17.03.2011 / 22:33
12

Isso seria -prune , mas há um pequeno truque:

$ find . \( -name D -prune \) -o -name hi.dat

-prune significa "não procure mais neste caminho", então você precisa de outra ramificação para diretórios diferentes de D . ( -o significa "ou".) Para pular outros caminhos também:

$ find . \( \( -name D -o -name Dminor \) -prune \) -o -name hi.dat
    
por 17.03.2011 / 22:35
4

Um comando de localização mais geral é

find -path ./D -prune -o -name hi.dat -print

Advertência : o teste -path pode ainda não ser portátil / parte de um padrão POSIX.

Rationale : Em uma estrutura de diretório como a seguinte

$ find
.
./D
./A
./A/D
./A/D/hi.dat

comparado a

$ find . \( -name D -prune \) -o -name hi.dat
./D
./A/D

listará apenas os arquivos realmente pesquisados (explícito -print ) e não omitirá arquivos nos subdiretórios também chamados D ( -path ):

$ find -path ./D -prune -o -name hi.dat -print
./A/D/hi.dat
    
por 13.04.2013 / 12:30
0

Funciona piping grep -v,

$ find / -name "*~"|grep -v "/media"

parece em todos os lugares, mas não dentro do diretório de mídia

    
por 20.09.2014 / 23:25

Tags