Exclui o diretório no find

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 arquivos:

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

como obtenho 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 os dois seguintes comandos:

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

mas ambos retornam isto:

./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 diretório foo-exclude-me ?

    
por Tyilo 07.03.2013 / 18:50

2 respostas

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

Sem -print , a ação padrão implícita se aplica a todas as correspondências, mesmo as limpas. O -print explícito se aplica somente nas condições especificadas, que são -name 'foo*' apenas na outra ramificação de -name 'foo-exclude-me' .

Em geral, use um -print explícito sempre que você 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-me não corresponde a ./foo-exclude-me/* (sem / ). Adicionar ! -path ./foo-exclude-me funcionaria.

    
por 07.03.2013 / 19:02
-2

-bash-4.1$ find . -exec ls -l {} + -name 'a.out' -prune -o -name '*' -exec rm -f {} + -exec ls -l {} +

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

.:
total 16
-rw-r--r--. 1 oradba dba 499 Jan 18 19:30 a.out
-rw-r--r--. 1 oradba dba 499 Jan 18 20:59 b.out
-rw-r--r--. 1 oradba dba 499 Jan 18 20:59 c.out
-rw-r--r--. 1 oradba dba 499 Jan 18 20:59 d.out
rm: cannot remove '.': Is a directory
ls: cannot access ./b.out: No such file or directory
ls: cannot access ./d.out: No such file or directory
ls: cannot access ./c.out: No such file or directory
.:
total 4
-rw-r--r--. 1 oradba dba 499 Jan 18 19:30 a.out

    
por 19.01.2017 / 02:02

Tags