2011-10-10 12 views
61

Ho esaminato altre domande simili, ma non ne ho trovato uno che mi avrebbe permesso di cogliere il concetto e renderlo applicabile alla mia situazione in base alla mia limitata tempo. Sto semplicemente eseguendo il comando find per trovare determinati file, ma alcuni file nelle sottodirectory hanno lo stesso nome che voglio ignorare. Grazie per qualsiasi aiuto. Di seguito è riportato il comando che sto usando:Come trovare solo i file in una determinata directory e ignorare le sottodirectory usando bash

Il file/modello che mi interessa: /dev/abc-scanner,/dev/abc-cash ....

Il comando:

find /dev/ -name 'abc-*' 

Ciò che viene restituito:

/dev/abc-scanner 
/dev/abc-cash 
... 
... 
... 
/dev/.udev/names/abc-scanner 
/dev/.udev/names/abc-cash 

voglio ignorare queste ultime file: /dev/.udev/...

+7

ignorare le sottodirectory specifici, o non scendere in alcun subdire ctories? Per quest'ultimo, usa l'opzione -maxdepth 1 – frankc

+0

@frankc Pubblicalo come risposta. – cnicutar

+0

possibile duplicato di [exclude directory da find. comando] (http://stackoverflow.com/questions/4210042/exclude-directory-from-find-command) – BroSlow

risposta

95

Se si desidera solo per limitare il ritrovamento al primo livello si può fare:

find /dev -maxdepth 1 -name 'abc-*' 

... o se si vuole particolarmente escludere la directory .udev, si può fare:

find /dev -name '.udev' -prune -o -name 'abc-*' -print 
+0

Se volessi elencare dove tutti i suddetti collegamenti simbolici hanno trovato il modello sopra, dovrei semplicemente usare una pipe? Qualcosa come find/dev -maxdepth 1 -name 'abc- *' | ls -l – suffa

+1

È preferibile usare 'xargs', quindi qualcosa del tipo:' find/dev -maxdepth 1 -name 'abc- *' | xargs ls -l', ma se c'è qualche possibilità che abbiano spazi bianchi nei nomi, dovresti trovare 'find/dev -maxdepth 1 -name 'abc- *' -print0 | xargs -0 ls -l' –

+0

Tuttavia, come [la risposta di Stephen Darlington fa riferimento] (http://stackoverflow.com/questions/7715485/how-to-only-find-files-in-a-given-directory-and -ignore-subdirectories-using-bash/7715550 # 7715550), non sono sicuro del motivo per cui non dovresti semplicemente "ls -l/dev/abc- *" –

7

C'è qualche ragione particolare per cui è necessario utilizzare find? Puoi semplicemente usare ls per trovare i file che corrispondono a un modello in una directory.

ls /dev/abc-* 

Se si ha bisogno di utilizzare find, è possibile utilizzare l'interruttore -maxdepth 1 ad applicarsi solo nella directory specificata.

+0

Penso che tu intenda '-maxdepth 1' piuttosto che' -maxdepth 0' –

+4

Va sottolineato che il jolly è la parte importante qui, non 'ls'. Puoi trovare gli stessi file con 'echo' o' wc' o cosa hai, perché la shell espande il carattere jolly per te. Quindi 'per file in/dev/abc- *; fare qualcosa con ogni "$ file"; done' potrebbe essere ciò che l'OP sta effettivamente cercando. – tripleee

+1

Ah, non riesco mai a ricordare da che parte è ... Grazie per la modifica. Inoltre, vale la pena notare che non è universale. Ad esempio, la versione di 'find' di Solaris non ce l'ha. –

2

Questo può fare quello che vuoi:

find /dev \(! -name /dev -prune \) -type f -print 
+0

Sì, questo funziona. -maxdepth non è implementato in find su alcuni Unix più vecchi. – CCTO

Problemi correlati