2012-02-08 10 views
10

Sto cercando di individuare tutti i file PDF in alcune cartelle e sottocartelle, solo nel terminale, anziché in uno script. Sono anche abbastanza nuovo per Linux, quindi scusati se ho perso qualcosa di ovvio, o forse vitale per diagnosticare il mio particolare problema.Globbing con ls per trovare tutti i file che corrispondono a un determinato pattern

Sto usando bash 4.1.5 (1) -release (i486-pc-linux-gnu), e ho fatto qualche ricerca su google riguardo le espressioni glob ed extglob, e appare la sintassi che dovrei usare è

$ ls **.pdf 

Questo però non trova niente, poiché non v'è alcun file corrisponde al modello *.pdf nella cartella corrente ./; sembra voler leggere ** come *:

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

Non ci sono file PDF altrove, in sottocartelle tra 1 e 5 in profondità (in particolare nel ogni sottocartella 1-profondità), alcuni dei quali posso vedere controllando con

$ ls */*.pdf 

Quindi, ls sembra funzionare correttamente. Il suo manuale sembra non essere molto utile, dal momento che tutto ciò che ho potuto vedere potrebbe essere utile per noi chiamando lo ls con il flag -R, che non risolve il problema in nessuno dei casi sopra descritti.

Ho provato a utilizzare i pattern extglob (assicurandomi di accenderli con shopt). Posso vedere i miei file depth-1 con ls */*?(.)pdf, ma non riesco a vedere nulla con ls .*(/*)pdf o ls .*(/*).pdf, anche all'interno di una sottodirectory in cui sono presenti PDF.

Ho letto altrove (in riferimento al file .gitignore in un repository git) che lo schema ** non funziona per tutti.

Ciò potrebbe influire su di me e come potrei risolverlo (idealmente senza privilegi di superutente)? Potrebbe anche questo (o qualche problema correlato) influenzare la funzionalità di extglob?

risposta

13

Si può prendere in considerazione trovare

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

o

find . -name '*.pdf' -ls 

dove. è la tua attuale directory di lavoro. La funzionalità glob viene fornita con 4.0+ bash. Le estensioni glob non sono portatili in altre parole.

5

Le opzioni extglob e globstar sono necessarie per ottenere la funzionalità estesa dalla libreria glob; vengono attivati ​​utilizzando l'utilità di shell (shopt) come descritto di seguito.

Per utilizzare globstar (che causa il comportamento del modello ** come descritto nel manuale di bash) è necessario attivarlo (in bash 4.0+) con

shopt -s globstar 

e per consentire ai più "funzionali" regex tipo espressioni come ?(ab) e *(ab) il loro pieno effetto, utilizzare

shopt -s extglob 

Per attivare le opzioni di nuovo, specificare il flag -u invece di s, per eaxample

shopt -u globstar 
Problemi correlati