2012-02-08 16 views
10

Estoy tratando de localizar todos los archivos PDF en alguna carpeta y cualquier subcarpeta, solo en el terminal, en lugar de en un script. También soy bastante nuevo en Linux, así que discúlpame si me he olvidado de algo obvio, o quizás vital para diagnosticar mi problema en particular.Globing con ls para encontrar todos los archivos que coinciden con un determinado patrón

Estoy usando bash 4.1.5 (1) -release (i486-pc-linux-gnu), y he hecho algunas preguntas sobre google sobre expresiones glob y extglob, y aparece la sintaxis que debería estar usando es

$ ls **.pdf 

sin embargo, esto no encuentra nada, ya que no hay archivo que coincida con el patrón *.pdf en la carpeta actual ./; parece querer leer ** como *:

ls: cannot access **.pdf: No such file or directory 

Hay archivos PDF en otro lugar, en subcarpetas entre 1 y 5 de profundidad (en particular en cada subcarpeta 1-profunda), algunas de las cuales se puede ver mediante la comprobación con

$ ls */*.pdf 

Por lo tanto, ls parece estar funcionando correctamente. Su manual parece no ser muy útil, ya que todo lo que pude ver que podría ser de alguna utilidad al llamar al ls con el indicador -R, que no resuelve el problema en ninguno de los casos anteriores.

He intentado usar patrones extglob (asegurándome de activarlos con shopt). Puedo ver mis archivos depth-1 con ls */*?(.)pdf, pero no puedo ver nada con ls .*(/*)pdf o ls .*(/*).pdf, incluso desde un subdirectorio donde hay archivos PDF.

He leído en otro lugar (en referencia al archivo .gitignore en un repositorio de git) que el patrón ** no funciona para todos.

¿Esto podría afectarme y cómo podría remediarlo (idealmente sin privilegios de superusuario)? ¿Podría esto (o algún problema relacionado) afectar también la funcionalidad de extglob?

Respuesta

13

Es posible que desee considerar el encontrar

find . -name '*.pdf' -exec ls -l {} \; 

o

find . -name '*.pdf' -ls 

dónde. es su directorio de trabajo actual. La funcionalidad global viene con 4.0+ bash. Las extensiones glob no son portátiles en otras palabras.

5

Las opciones extglob y globstar son necesarias para obtener la funcionalidad extendida de la biblioteca glob; se encienden utilizando la utilidad de opciones de shell (shopt) como se describe a continuación.

Para usar el globstar (que hace que el patrón ** se comporte como se describe en el manual de bash), debe activarlo (en bash 4.0+) con

shopt -s globstar 

y permitir a los más expresiones de tipo de expresiones regulares "funcionales" como ?(ab) y *(ab) su efecto completo, utilice

shopt -s extglob 

Para activar las opciones de nuevo, especifique la bandera -u en lugar de s, por eaxample

shopt -u globstar 
Cuestiones relacionadas