¿Cómo puedo encontrar todos los archivos y directorios que coincidan 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:
find . -name 'foo-exclude-me' -prune -o -name 'foo*' find . -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 adecuadamente el foo-exclude-me
? directorio?
Respuesta aceptada:
find . -name 'foo-exclude-me' -prune -o -name 'foo*' -print
Sin -print
, la acción predeterminada implícita se aplica a todas las coincidencias, incluso a las eliminadas. El -print
explícito se aplica solo bajo las condiciones especificadas, que son -name 'foo*'
solo en la rama else de -name 'foo-exclude-me'
.
En términos generales, use un -print
explícito siempre que esté haciendo algo más complejo que una conjunción de predicados.
¡Tu segundo intento con ! -path './foo-exclude-me/*'
no funcionó porque ./foo-exclude-me
no coincide con ./foo-exclude-me/*
(sin /
final ). ¡Añadiendo ! -path ./foo-exclude-me
funcionaría.