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