Excluir directorio en find

11

¿Cómo puedo encontrar cada archivo y directorio que coincida con un patrón, excluyendo un directorio usando find?

Digamos que tengo la siguiente estructura de archivos;

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

¿Cómo obtendría el siguiente resultado usando find:

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

He intentado usar los dos comandos siguientes:

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

pero ambos devuelven esto:

./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

¿Cómo puedo excluir correctamente el foo-exclude-medirectorio?

Tyilo
fuente
Intenta usar en foo-exclude-melugar de ./foo-exclude-me. También intente agregar -printal final del comando.
n0pe
@MaxMackie perfecto :)
Tyilo
¿Lo arregló? ¿Cuál fue la solución que funcionó para usted? Puedo ponerlo en una respuesta en lugar de un comentario.
n0pe
@MaxMackie usando ambos -printy en foo-exclude-melugar de ./foo-exclude-me.
Tyilo
Impresionante, se ve como Gilles Me golpearon a él sin embargo :)
n0pe

Respuestas:

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

Sin no -print, la acción implícita predeterminada se aplica a todas las coincidencias, incluso a las podadas. Lo explícito se -printaplica solo bajo las condiciones especificadas, que -name 'foo*'solo están en la rama else de -name 'foo-exclude-me'.

En términos generales, use un explícito -printsiempre que haga algo más complejo que una conjunción de predicados.

Su segundo intento con ! -path './foo-exclude-me/*'no funcionó porque ./foo-exclude-meno coincide ./foo-exclude-me/*(sin seguimiento /). Agregar ! -path ./foo-exclude-mefuncionaría.

Gilles 'SO- deja de ser malvado'
fuente
-2
-bash-4.1 $ buscar. -exec ls -l {} + -name 'a.out' -prune -o -name '*' -exec rm -f {} + -exec ls -l {} +

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

.:
total 16
-rw-r - r--. 1 oradba dba 499 18 de enero 19:30 a.out
-rw-r - r--. 1 oradba dba 499 18 de enero 20:59 b.out
-rw-r - r--. 1 oradba dba 499 18 de enero 20:59 c.out
-rw-r - r--. 1 oradba dba 499 18 de enero 20:59 d.out
rm: no se puede eliminar `. ': es un directorio
ls: no se puede acceder ./b.out: no existe tal archivo o directorio
ls: no se puede acceder ./d.out: no existe tal archivo o directorio
ls: no se puede acceder ./c.out: no existe tal archivo o directorio
.:
total 4
-rw-r - r--. 1 oradba dba 499 18 de enero 19:30 a.out

usuario211226
fuente
Usé la opción de podar para omitir a.out y funciona bien - art.s
user211226
Usted absolutamente no explica por qué -prunees relevante. -prunees una de las opciones más complicadas para findcausar que se desactive -print(que está habilitada de forma predeterminada)
grochmal
-prune True; Si el archivo es un directorio, no descienda a él. - Por lo tanto, no funcionará en los directorios como protección. - art.s
user211226