Excluir diretório na localização

11

Como posso encontrar todos os arquivos e diretórios correspondentes a um padrão, excluindo um diretório usando find?

Digamos que eu tenha a seguinte estrutura de arquivo;

.
  foo-exclude-me /
    foo.txt
  foo-exclude-me-not /
    foo.txt
  Barra/
    foo.txt
    foobar /
      bar.txt
      foofoo.txt

como obteria a seguinte saída usando find:

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

Eu tentei usar o seguinte comando:

encontrar . -name 'foo-excluir-me' -prune -o -name 'foo *'
encontrar . -name 'foo *' \! -path './foo-exclude-me/*'

mas os dois retornam isso:

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me # << this should be excluded
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

Como posso excluir corretamente o foo-exclude-mediretório?

Tyilo
fonte
Tente usar em foo-exclude-mevez de ./foo-exclude-me. Além disso, tente anexar -printno final do comando.
N0pe 7/03/13
@MaxMackie perfect :)
Tyilo 31 /
Consertou isso? Qual foi a correção que funcionou para você? Posso colocá-lo em uma resposta em vez de um comentário.
N0pe 7/03/13
@MaxMackie usando ambos -printe em foo-exclude-mevez de ./foo-exclude-me.
Tyilo
Impressionante, parece que Gilles chegou antes de mim embora :)
n0pe

Respostas:

11
find . -name 'foo-exclude-me' -prune -o -name 'foo*' -print

Com não -print, a ação padrão implícita se aplica a todas as correspondências, mesmo as removidas. O explícito -printse aplica somente às condições especificadas, que estão -name 'foo*'apenas na ramificação else de -name 'foo-exclude-me'.

De um modo geral, use um explícito -printsempre que estiver fazendo algo mais complexo do que uma conjunção de predicados.

Sua segunda tentativa com ! -path './foo-exclude-me/*'não funcionou porque ./foo-exclude-menão corresponde ./foo-exclude-me/*(não à direita /). Adicionar ! -path ./foo-exclude-mefuncionaria.

Gilles 'SO- parar de ser mau'
fonte
-2
-bash-4.1 $ find. -exec ls -l {} + -nome 'a.out' -prune -o -name '*' -exec rm -f {} + -exec ls -l {} +

-rw-r - r--. 1 oradba dba 499 18 de janeiro às 19:30 ./a.out
-rw-r - r--. 1 oradba dba 499 18 de janeiro às 20:59 ./b.out
-rw-r - r--. 1 oradba dba 499 18 de janeiro às 20:59 ./c.out
-rw-r - r--. 1 oradba dba 499 18 de janeiro às 20:59 ./d.out

.:
16 total
-rw-r - r--. 1 oradba dba 499 18 de janeiro às 19:30 a.out
-rw-r - r--. 1 oradba dba 499 18 de janeiro às 20:59 b.out
-rw-r - r--. 1 oradba dba 499 18 de janeiro 20:59 c.out
-rw-r - r--. 1 oradba dba 499 18 de janeiro 20:59 d.out
rm: não é possível remover `. ': é um diretório
ls: não pode acessar ./b.out: esse arquivo ou diretório não existe
ls: não pode acessar ./d.out: esse arquivo ou diretório não existe
ls: não pode acessar ./c.out: esse arquivo ou diretório não existe
.:
4 total
-rw-r - r--. 1 oradba dba 499 18 de janeiro às 19:30 a.out

user211226
fonte
Usou a opção de ameixa para pular a.out e funciona bem - art.s
user211226
Você absolutamente não explica por que -pruneé relevante. -pruneé uma das opções mais complicadas para find'desabilitar -print(que é ativado por padrão)'
grochmal
-prune True; se o arquivo for um diretório, não desça nele. - Portanto, ele não funcionará nos diretórios como proteção. - art.s
user211226