Estaba tratando de obtener una lista de todos los archivos python y html en un directorio con el comando find Documents -name "*.{py,html}".
Luego apareció la página del manual:
Las llaves dentro del patrón ('{}') no se consideran especiales (es decir, find. -Name 'foo {1,2}' coincide con un archivo llamado foo {1,2}, no con los archivos foo1 y foo2.
Como esto es parte de una cadena de tuberías, me gustaría poder especificar qué extensiones coincide en tiempo de ejecución (sin codificación rígida). Si find simplemente no puede hacerlo, un perl one-liner (o similar) estaría bien.
Editar: La respuesta que finalmente se me ocurrió incluye todo tipo de basura, y también es un poco larga, así que la publiqué como respuesta a la picazón original que estaba tratando de rascar. Siéntete libre de hackear eso si tienes mejores soluciones.

locate, aunque con la advertencia de que la actualización internab puede no estar actualizada. Pero es rapido.Respuestas:
Uso
-o, que significa "o":Tendría que construir esa línea de comando mediante programación, lo cual no es tan fácil.
¿Estás usando bash (o Cygwin en Windows)? Si es así, debería poder hacer esto:
que podría ser más fácil de construir mediante programación.
fuente
**búsqueda recursiva; Bash solo lo admite en las versiones 4.0 y posteriores, y solo conshopt -s globstar.-names con paréntesis, si lo estás usando-exec. Por ejemplofind Documents \( -name "*.py" -o -name "*.html" \) -exec file {} \;-print0para manejar nombres de archivos con espacios.Algunas ediciones de find, principalmente en sistemas Linux, posiblemente en otras, también admiten las opciones -regex y -regextype, que encuentran archivos con nombres que coinciden con la expresión regular.
por ejemplo
debería hacer el truco en el ejemplo anterior. Sin embargo, esta no es una función de búsqueda POSIX estándar y depende de la implementación.
fuente
find . -regex ".*\.\(py\|html\)$"esto funciona porque encuentra valores predeterminados para las expresiones regulares de estilo Emacs, que son ligeramente diferentes, por lo que no tiene que especificar el tipo de expresión regular.-regextype posix-egrepes útil (de lo contrario, necesitaría escapar de muchos caracteres). Este es el comando find que he usado para un dist-hook que construye un zip de distribución de Windows (encuentra los archivos para cambiar y en el archivo los cambia a dos-eol):find -regextype posix-egrep -regex ".*(\.([chyl]|def|cpy|cob|conf|cfg)|(README|ChangeLog|AUTHORS|ABOUT-NLS|NEWS|THANKS|TODO|COPYING.*))$" -exec sed -i -e 's/\r*$/\r/' {} \;Podrías agregar más
-namecláusulas mediante programación , separadas por-or:O bien, elija un bucle simple:
fuente
*.pyarchivos o tienes alguna versión extraña defind. El comando mencionado anteriormente funciona bien.-iname. Solo devuelve*.pyarchivos si lo escribe en la última posición (también loiname *.htmles la primera expresión) . Yo uso el comando en Debian.Esto encontrará todos los archivos .c o .cpp en Linux
No necesita el paréntesis escapado a menos que esté haciendo algunas modificaciones adicionales. Aquí, desde la página de manual, dicen si el patrón coincide, imprímalo. Quizás están tratando de controlar la impresión. En este caso, -print actúa como un condicional y se convierte en un condicional "AND'd". Evitará que se impriman los archivos .c.
Pero si le gusta la respuesta original, puede controlar la impresión. Esto también encontrará todos los archivos .c.
Un último ejemplo para todos los archivos fuente c / c ++
fuente
Tenía una necesidad similar Esto funcionó para mí:
fuente
()find -name "*.cpp" -o -name "*.c" -o -name "*.cc" -print0tuve que usar un par de parens para agrupe el segundo u operador.find -name "*.cpp" -o \( -name "*.c" -o -name "*.cc" \) -print0Puede ser que -print0, que siempre es "verdadero", haya afectado la lógica.Mi defecto ha sido:
find -type f | egrep -i "*.java|*.css|*.cs|*.sql"Al igual que el proceso menos ejecutivo de
findejecución por Brendan Long y Stephan202 et al .:fuente
egrepregexp, más bien, tienes un globo de shell donde se debe usar una expresión regular. (Además, elfinduso típico es:,find {directory} [options...] [action]donde, según impl,directorypuede ser predeterminado.yactionpredeterminado-print, pero seré explícito). Entonces, en su lugar, use algo como:find . -type f -print | egrep -i '\.java$|\.css$|\.cs$|\.sql$'Pero también, como alternativa realmente rápida afind, uno también podría intentelocatede manera similar (aunque no necesariamente actualizado, ya que consulta una base de datos interna para obtener una lista de archivos)simple pero funciona :)
fuente
Necesitaba eliminar todos los archivos en directorios secundarios, excepto algunos archivos. Lo siguiente funcionó para mí (tres patrones especificados):
fuente
\(\)Se requieren llaves dentro del patrón para el patrón de nombre conorMientras que para el patrón de nombre con
andoperador no es necesariofuente
Esto funciona en AIX Korn Shell.
Esto está buscando
*.cblo*.dmsque tienen 1 día de antigüedad, solo en el directorio actual, omitiendo los subdirectorios.fuente
fuente
Qué pasa
Enumera todos los archivos que terminan con .py o .html en sus nombres de archivo
fuente