shell - parametros - find name
patrón `find-name` que coincide con múltiples patrones (10)
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 vino la página del manual:
Las llaves dentro del patrón (''{}'') no se consideran especiales (es decir, busque. -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 coinciden en el tiempo de ejecución (sin codificación). Si encontrar simplemente no puede hacerlo, un perl de una línea (o similar) estaría bien.
Edición: la respuesta que finalmente encontré 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éntase libre de piratear eso si tiene mejores soluciones.
Algunas ediciones de find, en su mayoría 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
find . -regextype posix-egrep -regex ".*/.(py|html)$"
Debe 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.
Esto encontrará todos los archivos .c o .cpp en linux
$ find . -name "*.c" -o -name "*.cpp"
No necesita el paréntesis de escape a menos que esté haciendo algunas modificaciones adicionales. Aquí, desde la página del manual, están diciendo si el patrón coincide, imprímalo. Quizás están intentando controlar la impresión. En este caso, la huella actúa como un condicional y se convierte en un condicional "AND''d". Evitará que se impriman archivos .c
$ find . -name "*.c" -o -name "*.cpp" -print
Pero si te gusta la respuesta original puedes controlar la impresión. Esto encontrará todos los archivos .c también.
$ find . /( -name "*.c" -o -name "*.cpp" /) -print
Esto funciona en AIX Korn Shell.
find *.cbl *.dms -prune -type f -mtime -1
Esto está buscando *.cbl
o *.dms
que tienen 1 día de antigüedad, solo en el directorio actual, omitiendo los subdirectorios.
Mi valor predeterminado ha sido:
find -type f | egrep -i "*.java|*.css|*.cs|*.sql"
Al igual que los procesos menos ejecutables, find
ejecución de Brendan Long y Stephan202 et al .:
find Documents /( -name "*.py" -or -name "*.html" /)
Necesitaba eliminar todos los archivos en direcciones secundarias, excepto algunos archivos. Lo siguiente funcionó para mí (tres patrones especificados):
find . -depth -type f -not -name *.itp -and -not -name *ane.gro -and -not -name *.top -exec rm ''{}'' +
Podría agregar más cláusulas programáticamente, separadas por -or
:
find Documents /( -name "*.py" -or -name "*.html" /)
O, en su lugar, ir para un bucle simple:
for F in Documents/*.{py,html}; do ...something with each ''$F''... ; done
Tuve una necesidad similar. Esto funcionó para mí:
find ../../ /( -iname ''tmp'' -o -iname ''vendor'' /) -prune -o /( -iname ''*.*rb'' -o -iname ''*.rjs'' /) -print
Utilice -o
, que significa "o":
find Documents /( -name "*.py" -o -name "*.html" /)
Edición : Lo siento, solo vuelve a leer la pregunta ... necesitarías construir esa línea de comandos mediante programación, lo cual no es tan fácil.
¿Está utilizando bash (o Cygwin en Windows)? Si es así, debería poder hacer esto:
ls **/*.py **/*.html
lo que podría ser más fácil de construir programáticamente.
Edit : @artbristol comentario aplicado a la respuesta.
#! /bin/bash
filetypes="*.py *.xml"
for type in $filetypes
do
find Documents -name "$type"
done
simple pero funciona :)
find MyDir -iname "*.[j][p][g]"
+
find MyDir -iname "*.[b][m][p]"
=
find MyDir -iname "*.[jb][pm][gp]"