patrón 'find-name' que coincide con varios patrones


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 de manual:

Las llaves dentro del patrón ('{}') no se consideran especiales (es decir, find . - nombre ' foo{1,2}' coincide con un archivo llamado foo{1,2}, no 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 hardcoding). Si encontrar 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 una respuesta a la picazón original que estaba tratando de rascar. Siéntase libre de hackear eso si tiene mejores soluciones.

 246
Author: Community, 2009-07-16

10 answers

Use -o, que significa"o":

find Documents \( -name "*.py" -o -name "*.html" \)

Editar : Lo siento, solo vuelve a leer la pregunta... necesitarías construir esa línea de comandos programáticamente, lo cual no es tan fácil.

¿Estás usando bash (o Cygwin en Windows)? Si usted es, usted debe ser capaz de hacer esto:

ls **/*.py **/*.html

Que podría ser más fácil de construir programáticamente.

Editar : Comentario aplicado @artbristol a la respuesta.

 370
Author: RichieHindle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-13 11:51:36

Algunas ediciones de find, la mayoría en sistemas linux, posiblemente en otras también soportan las opciones-regex y-regextype, que encuentra archivos con nombres que coinciden con la regex.

Por ejemplo

find . -regextype posix-egrep -regex ".*\.(py|html)$" 

Debería hacer el truco en el ejemplo anterior. Sin embargo, esta no es una función POSIX find estándar y depende de la implementación.

 46
Author: intelekt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-09 10:01:07

Se pueden agregar programáticamente más -name cláusulas, separadas por -or:

find Documents \( -name "*.py" -or -name "*.html" \)

O, vaya por un bucle simple en su lugar:

for F in Documents/*.{py,html}; do ...something with each '$F'... ; done
 25
Author: Stephan202,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-03 16:43:25

Tenía una necesidad similar. Esto funcionó para mí:

find ../../ \( -iname 'tmp' -o -iname 'vendor' \) -prune -o \( -iname '*.*rb' -o -iname '*.rjs' \) -print
 10
Author: bkidd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-27 16:54:01

Esto encontrará todo .c or .archivos cpp en linux

$ find . -name "*.c" -o -name "*.cpp"

No necesita el paréntesis de escape a menos que esté haciendo algunos mods adicionales. Aquí desde la página man están diciendo que si el patrón coincide, imprímalo. Tal vez están tratando de controlar la impresión. En este caso-print actúa como condicional y se convierte en condicional "AND'd". Evitará cualquier .c archivos de ser impresos.

$ find .  -name "*.c" -o -name "*.cpp"  -print

Pero si te gusta la respuesta original, puedes controlar la impresión. Este lo encontrará todo .archivos c también.

$ find . \( -name "*.c" -o -name "*.cpp" \) -print
 6
Author: netskink,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-23 18:48:26

Mi defecto ha sido:

find -type f | egrep -i "*.java|*.css|*.cs|*.sql"

Al igual que el proceso less intentve find ejecución por Brendan Long y Stephan202 et al.:

find Documents \( -name "*.py" -or -name "*.html" \)

 3
Author: Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-14 16:59:25
#! /bin/bash
filetypes="*.py *.xml"
for type in $filetypes
do
find Documents -name "$type"
done

Simple pero funciona:)

 2
Author: mnrl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-23 18:49:57

Necesitaba eliminar todos los archivos en dirs hijos 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 '{}' +
 1
Author: Adobe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-13 15:51:01
find MyDir -iname "*.[j][p][g]"
+
find MyDir -iname "*.[b][m][p]"
=
find MyDir -iname "*.[jb][pm][gp]"
 1
Author: user7531934,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-08 01:27:13

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.

 0
Author: Abdul M Gill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-17 21:51:28