¿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-me
directorio?
foo-exclude-me
lugar de./foo-exclude-me
. También intente agregar-print
al final del comando.-print
y enfoo-exclude-me
lugar de./foo-exclude-me
.Respuestas:
Sin no
-print
, la acción implícita predeterminada se aplica a todas las coincidencias, incluso a las podadas. Lo explícito se-print
aplica 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
-print
siempre 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-me
no coincide./foo-exclude-me/*
(sin seguimiento/
). Agregar! -path ./foo-exclude-me
funcionaría.fuente
fuente
-prune
es relevante.-prune
es una de las opciones más complicadas parafind
causar que se desactive-print
(que está habilitada de forma predeterminada)