¿Hay una manera simple de encontrar recursivamente todos los archivos en una jerarquía de directorios que no terminen en una lista de extensiones? Por ejemplo, todos los archivos que no son * .dll o * .exe
UNIX / GNU find, por poderoso que sea, no parece tener un exclude
modo (o me falta), y siempre me ha resultado difícil usar expresiones regulares para encontrar cosas que no coinciden con una expresión en particular .
Estoy en un entorno de Windows (usando el puerto GnuWin32 de la mayoría de las herramientas GNU), por lo que estoy igualmente abierto para soluciones exclusivas de Windows.
command-line
find
Cristian Diaconescu
fuente
fuente
-not
puede ser reemplazado por'!'
(se recomienda cotizar). Por otro lado,-name
es sensible a-iname
mayúsculas y minúsculas.fuente
-not
es una mala opción, esta!
funciona bien :)Las primeras dos opciones de nombre no tienen opción de impresión, por lo que se omitieron. Todo lo demás está impreso.
fuente
Podrías hacer algo usando el comando grep:
La
-v
bandera engrep
significa específicamente "encuentra cosas que no coinciden con esta expresión".fuente
uno mas :-)
Referencia de comando de búsqueda de Unix
fuente
fuente
Linux / OS X:
A partir del directorio actual, busque recursivamente todos los archivos que terminen en .dll o .exe
Comenzando desde el directorio actual, encuentre recursivamente todos los archivos que NO terminen en .dll o .exe
Notas:
(1) La opción P en grep indica que estamos usando el estilo Perl para escribir nuestras expresiones regulares que se utilizarán junto con el comando grep . Con el propósito de exceder el comando grep en conjunto con expresiones regulares, encuentro que el estilo Perl es el estilo más poderoso.
(2) La opción v en grep indica al shell que excluya cualquier archivo que satisfaga la expresión regular
(3) El carácter $ al final de decir ".dll $" es un carácter de control delimitador que le dice al shell que la cadena del nombre de archivo termina con ".dll"
fuente
Otras soluciones en esta página no son deseables si tiene una larga lista de extensiones (mantener una secuencia larga
-not -name 'this' -not -name 'that' -not -name 'other'
sería tediosa y propensa a errores) o si la búsqueda es programática y la lista de extensiones está construida en tiempo de ejecución.Para esas situaciones,
find
puede ser deseable una solución que separe más claramente los datos (la lista de extensiones) y el código (los parámetros para ). Dado un directorio y una estructura de archivos que se ve así:Puedes hacer algo como esto:
Lo que resulta en:
Puede cambiar la lista de extensiones sin cambiar el bloque de código.
NOTA no funciona con OSX nativo
find
: utilice gnu find en su lugar.fuente