¿Cómo encuentro un archivo por nombre de archivo en el terminal Mac OSX?

113

Quiero encontrar un archivo en mi Macbook con el nombre: abc.dmg. He tratado de usar Spotlight, pero no lo encuentra. Cuando intenté encontrar, y usé:, find -name abc.dmg -path /obtuve errores.

¿Cuál es la sintaxis adecuada para encontrar un archivo por nombre de archivo con el comando find en un terminal Mac OSX?

SPRBRN
fuente
@VxJasonxV Las preguntas de Apple son 100% sobre el tema para Superusuario, y no es necesario que todas las preguntas de Apple se trasladen allí. Sin embargo, las preguntas de iPhone o iPad se moverán cuando sea necesario.
BinaryMisfit
No fue tanto una razón para estar fuera de tema, sino el hecho de que hay un tema / sitio más específico para este tema general.
VxJasonxV
@Diago: ¿Ha habido alguna discusión sobre esto en meta o chat? Solo me pregunto porque AFAIK apple.SE se lanzará fuera de beta muy pronto, por lo que sería bueno que todos estén en la misma página.
Robert S Ciaccio
@calavera. Una discusión bastante antigua pero relevante se puede encontrar aquí . Apple SE, Ubuntu SE y Linux SE están para complementar a Super User, pero de ninguna manera queremos obligar a los usuarios a moverse. Prefiero hacer mis preguntas de Apple aquí en lugar de Apple, ya que uso 3 sistemas operativos diferentes. Si tengo una pregunta muy específica, la haré en un sitio más especializado.
BinaryMisfit

Respuestas:

157

En su forma más simple, findtoma un parámetro: la ruta. En su forma realmente útil, toma el camino seguido de criterios de estrechamiento.

Por lo tanto, quieres:

  • find (el programa)
  • / (el camino), y
  • -name abc.dmg (el criterio).
find / -name abc.dmg
VxJasonxV
fuente
9
Puede obtener errores de tipo de permiso denegado al buscar en toda la unidad, pero pueden ignorarse a menos que espere que el archivo esté en una carpeta restringida. Si es así, use sudo find / -name abc.dmg
Chris Nava
Probé, pero no hubo resultado.
SPRBRN
5
Presumiblemente, entonces, no tiene un archivo llamado abc.dmg en su computadora. Puede usar -iname en lugar de -name para hacer que el caso de búsqueda no sea sensible. Dudo mucho que realmente estés buscando "abc.dmg", y dado ese hecho (presumiblemente), es difícil decirte cuál es tu problema sin tener los detalles reales.
VxJasonxV
2
@rxt: si find doo no lo encuentra, no está allí ...
Robert S Ciaccio
3
Dado que el informe OP ha intentado encontrar en el texto de la pregunta, vale la pena señalar que el orden de los argumentos es find importante . Si debe haber find [path]+ [selection, grouping, and actions].
dmckee
20

find . -name '*.csv'por ejemplo me funcionó con comodines. OP también podría usar find . -name '*.dmg'para verificar su directorio actual, suponiendo que estuviera en él /.

pjammer
fuente
6

Puedes usar el locatecomando.

locate abc.dmg
Wuffers
fuente
2
Tenga en cuenta la osxetiqueta. slocate db no se rellena de forma predeterminada.
VxJasonxV
Lo probé, después de crear la base de datos, pero ningún resultado.
SPRBRN
si locatey mdfindambos fallan, es probable que el archivo no esté en su máquina. O no se llama como crees que se llama. ¿Quizás buscar TODOS los DMG sea tu próximo paso?
peelman
3

La forma más simple (que estoy seguro de que ya lo has intentado, pero bueno, déjame agregarlo al hilo de todos modos) es ingresar abc.dmg en el cuadro de búsqueda en la parte superior derecha de cualquier ventana del buscador, luego selecciona "Archivo Nombre "de las opciones en la barra de búsqueda que aparece.

No hay necesidad de la terminal.

Recuerde también que Spotlight solo indexa los directorios especificados en el panel de control de Spotlight y es posible que abc.dmg no esté en uno de esos directorios.

Corrígeme si estoy equivocado, pero creo que el comando find necesita saber qué generar:

find / -name abc.dmg -print

... debe imprimir cualquier resultado en el terminal (incluidos los errores de permiso).

Si no desea errores de permisos y desea buscar en otros directorios de Usuarios, entonces:

sudo find / -name abc.dmg -print
Júpiter
fuente
2

Puede usar las siguientes funciones de línea de comandos para buscar y abrir rápidamente archivos relevantes. Esto me resulta más fácil que escribir una larga cadena de consulta en la ventana de Spotlight.

Agregue las siguientes funciones en ~/.bash_aliases.

# find any item matching search query in file name
spot(){
  mdfind "kMDItemDisplayName=='*$1*'cd";
}

# restrict to files under (recursive) a specific path 
findpaper(){
    mdfind -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'cd";
}

# default to open the first entry unless 2nd positional argument is given
openpaper(){
    FILEID=$(printf "%sp" ${2:-1})

    open "$(mdfind -name -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'cd" | sed -n "${FILEID}")"

}

Ahora, source ~/.bash_aliasesabre o abre una nueva función de carga de terminal. Para buscar archivos con palabras, pie y 2016 en cualquier parte del nombre del archivo, haga

spot pie*2016 #or
spot 2016*pie

No hay necesidad de anteponer o agregar *a su consulta como patrón de búsqueda, '*$1*'ya etiqueta la entrada de comodín al comienzo y al final de su consulta. Adicional cdes para mayúsculas y minúsculas e ignorar los signos diacríticos, por ejemplo, freddevolverá ambos, Frédéric y FrEDeric.

findpaperrestringirá la búsqueda a los resultados bajo una ruta específica (recursiva) mientras openpaper pie*201abrirá un resultado de búsqueda (o el primero de varios resultados) o openpaper pie*201 3abrirá la entrada del tercer resultado. Para evitar abrir scripts de bash u otros archivos que no sean documentos, puede restringir el contenido del archivo mediante atributos de búsqueda adicionales. Consulte Sintaxis de expresión de consulta de metadatos de archivo y https://ss64.com/osx/mdfind.html para usar otros operadores de búsqueda.

Samir
fuente
¡Increíble!
Tranquilizándolo
0

Capture una lista de cada archivo en su disco como root desde /

sudo find / &> ~/file-list.txt
sudo chown $(whoami) ~/file-list.txt

Cat el archivo completo a través de grep para buscar la unidad completa:

cat ~/file-list.txt | grep abc.dmg

Use expresiones regulares para mostrar solo archivos .jpg y .dmg:

cat ~/file-list.txt | grep -E "(\.dmg|\.jpg)"

Resultado:

Applications/Visualisations/CurvedSpaces-forMac.app/Contents/Resources/Textures/paper.jpg

... etc. Desafortunadamente, también capturará todos los discos montados, por lo que es mejor expulsar aquellos Time Machine que tienen muchos enlaces. ¡Así que en otra ventana corro watch tail -n 10 ~/file-list.txtque me muestra dónde está en mi truco horrible!

Tomachi
fuente
1
Malas prácticas o cosas que merecen algún comentario: (1) sudo find / > ~/file-list.txtparece mejor que ejecutar todo el shell como root. (2) find *saltará objetos ocultos (punto) (si los hay) en /. (3) &>es un bashismo. (4) Uso inútil de cat. (5) grep abc.dmgimprimirá, por ejemplo /foo/bar/123abcXdmg456/baz/whatever. // Una cosa buena que su respuesta aporta a este hilo (y otra respuesta no) es el enfoque en el que el usuario ejecuta finduna vez y luego reutiliza el resultado guardado varias veces sin consultar los sistemas de archivos una y otra vez. Sin embargo, esta ventaja potencial no se acentúa.
Kamil Maciorowski
Buen punto, gracias Kamil, lo he hecho y también he visto $ (whoami)
Tomachi