comando encontrar en Linux para localizar archivos pdf

11

Mi objetivo es encontrar todos los archivos pdf en una máquina remota, así que recurro al comando útil find. Entonces escribo

encontrar ~ * .pdf
o
encontrar ~ "* .pdf"
Y no consigo nada. Hago lo mismo en mi máquina y no obtengo nada. Hago una búsqueda regular desde el menú de mi máquina y encuentro bastantes archivos pdf. ¿Podría alguien decirme qué estoy haciendo mal?

akira
fuente
11
Mantenga sus opiniones negativas fuera de su pregunta si desea una buena respuesta. En una historia relacionada, findestá lejos de ser inútil.
wilhelmtell
8
Por supuesto que tienes derecho a la libertad de expresión. Pero sí quieres una buena respuesta, ¿verdad? No, no tienes derecho a una buena respuesta constructiva. Eso es un privilegio.
wilhelmtell
2
Un mal trabajador siempre culpa a sus herramientas. En otras palabras, PBCAK puro aquí.
Pascal Thivent
55
@Wilhelmtell, creo que la declaración de Martin es justa: el comando nunca debería haber sido llamado "buscar" en primer lugar, más como "walkpath_and_execute" ... no tiene la interfaz más intuitiva o fácil de usar y hace mucho más que simplemente encontrar archivos. El nombre simple "find" es engañoso porque sugiere una interfaz simple que no tiene. Claro, encontrar está lejos de ser inútil y funciona bastante bien, pero difícilmente se puede culpar a un principiante por no saber la diferencia entre "encontrar", "localizar", "cuál", etc.
Michael Aaron Safyan
1
@ Michael No culpé a nadie aquí; o, más bien, no fui yo quien culpó aquí. Ni siquiera dije que findes intuitivo. Sin embargo, probablemente podría decir lo mismo en un tono más agradable; a veces reacciono a comentarios negativos (tontos).
wilhelmtell

Respuestas:

30

findEstá lejos de ser inútil. Simplemente no lo estás usando correctamente.

tratar:

find . -type f -iname '*.pdf'

Mitch Dempsey
fuente
@ Martin - ¡Feliz de ayudar, solo asegúrese de marcar la pregunta como respondida!
Mitch Dempsey
@stepancheg Sí, ¿por qué no desconecta Internet e imprime una copia impresa?
bobobobo
9

Eche un vistazo a la documentación de findutils . El findcomando es increíblemente poderoso y, en consecuencia, tiene una interfaz algo complicada. Puedes hacer lo que quieras con:

find . -type f -iname '*.pdf' 

El comando anterior significa "buscar dentro. Para entradas de archivo de tipo con un nombre que no distinga entre mayúsculas y minúsculas * .pdf (e imprima el nombre de tales coincidencias)". El comando find se puede usar para ejecutar comandos en los archivos que se encuentran (en lugar de o además de imprimir los nombres de los archivos). Sin embargo, para sus propósitos, es posible que se sienta más cómodo con el comando de localización , que, suponiendo que haya creado la base de datos de localización utilizando updatedb , hace que sea muy fácil encontrar archivos. Por ejemplo:

locate '*.pdf'

También encontrará que el comando de localización suele ser más rápido que el comando de búsqueda, ya que la localización utiliza un índice de nombres de archivo (la base de datos de localización), mientras que la búsqueda recorrerá la jerarquía para cada invocación.

Michael Aaron Safyan
fuente
6

Simplemente te estás perdiendo el predicado que dice lo que estás buscando (p -name. Ej .)

Para buscar en el directorio de inicio por nombre:

find ~ -name \*.pdf

Tenga en cuenta que el comodín *debe escaparse para que el shell no lo interprete antes de que find lo tenga en sus manos. Usando '*.pdf'y "*.pdf"tendrá el mismo efecto que \*.pdf.

Para encontrar mayúsculas y minúsculas:

find ~ -iname \*.pdf

Para podar los resultados solo en archivos (la expresión de nombre probablemente se encargará de esto por usted, pero en caso de que tenga directorios con nombres extraños):

find ~ -type f -iname \*.pdf

Para asegurarse de que find sigue enlaces simbólicos (generalmente quiero hacer esto yo mismo cuando hago búsquedas):

find ~ -follow -type f -iname \*.pdf

Para hacer algo con los archivos que encontró: puede volcar esto en un archivo utilizando la redirección stdout (por ejemplo, agregar > filenameal final), o usar la -execopción para ejecutar un comando (consulte la página del manual para más detalles). Sin embargo, este último ejecuta un comando en cada archivo a la vez. a menudo es más rápido dejar que el xargscomando pase sus archivos encontrados como argumentos a otro comando, todo a la vez o grandes fragmentos a la vez. Por ejemplo, para greps ad-hoc (pero no indexados) a través de archivos de encabezado:

find ~ -follow -type f -name \*.h | xargs grep -nH "identifier"

Y una extensión final, para que ese último comando funcione correctamente si tiene archivos y directorios con espacios en ellos:

find ~ -follow -type f -name \*.h -print0 | xargs -0 grep -nH "identifier"
Owen S.
fuente
En realidad, "* .pdf" se expandiría si hay archivos en el directorio actual que terminen en .pdf, ¿verdad? (nota menor)
Peter Jaric
1
No en fiesta. Del manual bash: "El encerrar caracteres entre comillas dobles conserva el valor literal de todos los caracteres dentro de las comillas, con la excepción de [dólar], [comilla invertida], [canalización] y, cuando la expansión del historial está habilitada, [explosión]. " Pruébelo usted mismo para confirmar: ls "* .txt" en un directorio con archivos de texto.
Owen S.
Sí, tienes razón, por supuesto. No sé de dónde saqué esa idea. Gracias por corregirme.
Peter Jaric
3

echa un vistazo a este tutorial

creo que lo que quieres hacer es

find . -name "*.pdf"

fuente
Debería usar el inameatributo para una mejor visión del pasillo
Mitch Dempsey,
0

Solía ​​combinar el hallazgo con grep like

encontrar . . El | grep -i ".pdf"

tal vez no sea eficiente, pero hace el trabajo bien.

Tiberiu Hajas
fuente
Esto podría hacerse en finddirecto si hubiese deseado, a través de -iregex: find ~ -iregex '.*\.pdf'. El problema es que en findel patrón se trata como si siempre tuviera una ^en la parte delantera y una $en la parte posterior, por lo que su patrón debe ser un poco más complicado. También tenga .en cuenta: que en su patrón hay un comodín de un solo carácter, no un punto literal.
Owen S.
0

Encuentra los archivos que necesitas descargar en los últimos x días

find ~ -type f -iname '*.pdf' -mtime -1

encontrará sus archivos pdf en su ~directorio de inicio y debajo con extensión, .pdfindependientemente de las mayúsculas y minúsculas (eso es i iname) y modificado hasta hace 1 día porque he agregado mtime -1; si pones -60 en mtime serán los últimos 60 días.

r0berts
fuente
0

Para ejecutar una búsqueda dentro de los archivos "encontrados" existe esta construcción:

find <dir> -type f -iname <name> -exec grep -H <string> {} \;

El comando exec debe terminar con el ";" escapado y -H es necesario para que grep imprima la ruta del archivo además de la línea dentro del archivo donde está "string".

Ted Ballou
fuente