Si -prune
no funciona para usted, esto:
find -name "*.js" -not -path "./directory/*"
Advertencia: requiere recorrer todos los directorios no deseados.
Usa el -prune
primario. Por ejemplo, si desea excluir ./misc
:
find . -path ./misc -prune -o -name '*.txt' -print
Para excluir varios directorios, O entre paréntesis.
find . -type d \( -path ./dir1 -o -path ./dir2 -o -path ./dir3 \) -prune -o -name '*.txt' -print
Y, para excluir directorios con un nombre específico en cualquier nivel, use el -name
principal en lugar de -path
.
find . -type d -name node_modules -prune -o -name '*.json' -print
Encuentro más fácil razonar sobre lo siguiente que sobre otras soluciones propuestas:
find build -not \( -path build/external -prune \) -name \*.js
# you can also exclude multiple paths
find build -not \( -path build/external -prune \) -not \( -path build/blog -prune \) -name \*.js
Nota importante: las rutas que escribes después de -path
debe coincidir exactamente con lo que find
imprimiría sin la exclusión. Si esta oración lo confunde, asegúrese de usar rutas completas en todo el todo comando como este:find /full/path/ -not \( -path /full/path/exclude/this -prune \) ...
. Consulte la nota [1] si desea una mejor comprensión.
Dentro de \(
y \)
es una expresión que coincidirá exactamente build/external
(consulte la nota importante anterior) y, si tiene éxito, evitará atravesar cualquier cosa que se encuentre debajo . Esto luego se agrupa como una sola expresión con el paréntesis escapado y se antepone con -not
lo que hará find
omita todo lo que coincida con esa expresión.
Uno podría preguntarse si agregar -not
no hará que todos los demás archivos estén ocultos por -prune
reaparecer, y la respuesta es no. El camino -prune
funciona es que cualquier cosa, una vez que se alcanza, los archivos debajo de ese directorio se ignoran permanentemente.
Esto proviene de un caso de uso real, en el que necesitaba llamar a yui-compressor en algunos archivos generados por wintersmith, pero omití otros archivos que deben enviarse tal cual.
Nota [1] :Si desea excluir /tmp/foo/bar
y ejecuta find así "find /tmp \(...
"entonces debes especificar -path /tmp/foo/bar
. Si por el contrario ejecutas find así cd /tmp; find . \(...
entonces debes especificar -path ./foo/bar
.