No Bash:
shopt -s extglob
find !(D) -name hi.dat
Ksh e zsh funcionam de maneira semelhante.
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
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
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
Funciona piping grep -v,
$ find / -name "*~"|grep -v "/media"
parece em todos os lugares, mas não dentro do diretório de mídia