Encuentra archivos en Linux y excluye directorios específicos

14

Tengo un hallazgo como este:

rm -f crush-all.js
find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | while read line
do
   cat "$line" >> crush-all.js
   echo >> crush-all.js
done

Me gustaría agregar para excluir un directorio llamado "prueba" en el hallazgo, pero parece que no puedo entender cómo agregar "-tipo d" de alguna manera. ¿Cómo hice para hacer eso?

¡Gracias!

Asken
fuente

Respuestas:

22

Puede usar la -pathopción para buscarlo y combinarlo con el -notoperador.

find . ! -path "*/test/*" -type f -name "*.js" ! -name "*-min-*" ! -name "*console*"

Tenga en cuenta dos cosas

  • -path debe venir como primer argumento
  • el patrón coincide con el nombre de archivo completo, por -path testlo que nunca coincidirá con nada

Por cierto, no estoy seguro de por qué estás usando paréntesis, no hay diferencia. Solo se usa por precedencia, para construcciones como ! \( -name '*bla*' -name '*foo*' \)(es decir, no encuentre cosas que tengan ambos blay foo).

Un refinamiento adicional: no es necesario usar el bucle bash, simplemente puede hacer

find . ... -exec cat {} \; -exec echo \;

donde ... son los otros argumentos para find.

enero
fuente
2
find / -path ./test -prune -o ...

Cambie el nombre ./testpara que se ajuste a la ubicación de su directorio de prueba.

Charles Clavadetscher
fuente
2
En este caso, no olvide agregar la acción -print (porque -print no es la acción predeterminada) después de la opción -o
Bill Zhao
1

Puede probar con grep de esta manera (la carpeta aquí se llama test_folder):

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/path/to/test_folder/" | while read line

o si su búsqueda devuelve la ruta relativa:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "./relative_path/to/test_folder/" | while read line

o si desea todas las carpetas que tienen el mismo nombre pero con una ruta diferente

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/test_folder/" | while read line

Atentamente,

Antoine Rodriguez
fuente
1

Para ampliar lo que creo que @CharlesClavadetscheriba con su respuesta. Si omite un camino con -not -path ... findcontinuará descendiendo el camino. En cambio, el uso -pruneevitará que descienda más en el camino omitido, lo que lo hará más rápido. Entonces puedes hacer algo como

find . -path '*test/*' -prune -o -type f -name "*.js" ! -name "*-min*" ! -name "*console*" -print

fuente
0

Uso "no nombre completo" cuando solo estoy buscando un archivo. -name prueba el nombre de archivo real, pero -wholename prueba la ruta completa. Entonces, agregue un ignorar para la prueba a la pregunta anterior:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) ! -wholename "*test*"
Andrew Lorien
fuente