He heredado un gran archivo de medios sin unificación de un esquema organizativo. Su contenido se remontan al menos 10 años. Me han pedido que encontrar una aguja en esta pila de heno, y tengo algunas hipótesis en cuanto a que la aguja del nombre. Pero no sé su nombre por cierto. Quiero usar una sola find
comando en la Terminal para buscar nombres alternativos. Y quiero incluir un segundo conjunto: posibles extensiones de archivo. En pseudocódigo, aquí 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 el Terminal?
Respuestas
¿Demasiados anuncios?Utilice el comando
find /dir/to/search \( -iname '*guess1*' -o -iname '*guess2*' \) \
\( -iname '*.extension1' -o -iname '*.extension2' \)
find
trabaja de forma recursiva. Uso -maxdepth 1
hacer es no recursivo.
-iname
hace un insensible a mayúsculas-nombre de archivo que coincida.
Los argumentos son implícitamente unido por Y, pero se puede usar -o
O. Los paréntesis tienen que ser escapado con una barra diagonal inversa para protegerlos de la shell.
(Puede ser escrita en una sola línea; aquí he roto las líneas de usar \retorno para la lectura).
find
es lento. grep
y otras herramientas de búsqueda de texto están mucho más rápidos. A menos que crees que vas a encontrar la aguja en el pajar con el primer tiro, usted está probablemente mejor haciendo un find
en un archivo temporal, por ejemplo find . -print > /tmp/find.out
y luego busca en ese archivo para nombres de archivo que cumplen Tu criterio de búsqueda.
Si el volumen está indizado por foco, utilice mdfind
para resultados más rápidos.
mdfind -onlyin /dir/to/search '(kMDItemFSName==*guess1* || kMDItemFSName==*guess2*)' \
'&& (kMDItemFSName=*.extension1 || kMDItemFSName=*.extension2)'