Terminal: Agregar lógica a los directorios 'encontrar' que contienen [criterios A] o [criterios B]

1

He heredado un vasto archivo de medios sin un esquema organizativo unificador. Sus contenidos datan de al menos 10 años. Me han pedido que encuentre una aguja en este montón de heno, y tengo algunas conjeturas sobre el nombre de esa aguja. Pero no sé su nombre seguro. Quiero usar un solo comando find en la Terminal para buscar nombres alternativos. Y quiero incluir un segundo conjunto: posibles extensiones de archivo. En pseudocódigo, esto es lo que quiero decir: find [in a given directory] [files and folders whose name matches (*guess1* OR *guess2*) AND whose name matches (*.extension1 OR *.extension2)] . ¿Cómo debo expresar esto en la Terminal?

    
pregunta Crowder 01.05.2014 - 17:18

4 respuestas

3

Puedes hacer esto usando ls y grep con expresiones regulares

ls | grep -E "(guess1|guess2)(\.extension1|\.extension2)"

O si necesita buscar recursivamente en carpetas:

ls -R | grep -E "(guess1|guess2)(\.extension1|\.extension2)"
    
respondido por el Ben 01.05.2014 - 17:40
2

Usa el comando

find /dir/to/search \( -iname '*guess1*' -o -iname '*guess2*' \) \
                    \( -iname '*.extension1' -o -iname '*.extension2' \)

find funciona de forma recursiva. Use -maxdepth 1 para hacerlo no recursivo.

-iname hace una coincidencia de nombre de archivo que no distingue mayúsculas y minúsculas.

Los argumentos se unen implícitamente mediante AND, pero puede usar -o para hacerlo OR. Los paréntesis deben escaparse con una barra invertida para protegerlos del shell.

(Se podría escribir todo en una línea; aquí he roto las líneas usando \ return para facilitar la lectura.)

    
respondido por el 200_success 01.05.2014 - 23:40
1

Si Spotlight indexa el volumen, utilice mdfind para resultados más rápidos.

mdfind -onlyin /dir/to/search '(kMDItemFSName==*guess1* || kMDItemFSName==*guess2*)' \
                     '&& (kMDItemFSName=*.extension1 || kMDItemFSName=*.extension2)'
    
respondido por el 200_success 01.05.2014 - 23:59
1

find es lento. grep y otras herramientas de búsqueda de texto son mucho más rápidas. A menos que crea que va a encontrar la aguja en el pajar con el primer disparo, es probable que esté mejor haciendo un find en un archivo temporal, por ejemplo. find . -print > /tmp/find.out , y luego busque en ese archivo los nombres de archivo que cumplan con sus criterios de búsqueda.

    
respondido por el Scott Leadley 01.05.2014 - 21:47

Lea otras preguntas en las etiquetas