2013-04-25 7 views
5

Diciamo che ho una directory contenente un numero di sottodirectory, ognuna con un numero di file al loro interno. Desidero controllare quali di queste directory non contengono un file specifico. Ad esempio, se queste sono le mie directory:Escludere le directory in find che non contengono un nome file specifico?

dir/A: 
    foo 
    bar 
dir/B: 
    bar 
dir/C: 
    foo 
dir/D: 
dir/E: 
    foo 
    bar 

Se avessi voluto elencare tutte le directory che non contengono foo, vorrei avere:

dir/B 
dir/D 

E 'possibile fare questo con unix find, o fare Devo usare qualche strumento alternativo?

risposta

7

ho trovato una buona soluzione, dopo un un po 'di ricerca:

find . -type d \! -exec test -e '{}/foo' \; -print

Dove si sostituisce foo con qualsiasi file che si sta cercando.

Questo stamperà un elenco di tutte le directory che non contengono il file che si sta cercando.

+0

C'è un modo per rimuovere la cartella corrente './' che è presente nell'output ?, poiché se ho bisogno di copiare queste sottodirectory in un'altra directory, la presenza di '. /' Sarebbe dannosa – WanderingMind

0
comm -3 <(find -type d) <(find -name foo -printf '%h\n') 
  • ottenere tutte le directory
  • ottengono solo le directory che contengono foo
  • confronto, la stampa solo la differenza
0

1 - Creazione di un 1 scritto semplicemente di linea nella directory corrente (o da qualche parte nel tuo percorso). Diamo il nome check.sh:

cd "$1" && [[ ! -f "$2" ]] && pwd 

2 - Dare il permesso di esecuzione sopra scritto:

chmod +x ./check.sh 

3 - Infine utilizzare questa scoperta comando:

find . -maxdepth 1 -type d -exec ./check.sh '{}' foo \; 
0

Un po 'tardi alla festa, ecco una battuta che dovrebbe funzionare:

ls | xargs -I dir ls dir/foo > /dev/null 

Il trucco è che ls */foo silenziosamente passare sopra le directory non corrispondenti (le directory che non contengono 'foo'), quindi l'utilizzo di xargs lo costringerà a fornire output a stderr nelle directory che non contengono foo. Quindi è solo questione di buttare via stdout per vedere solo quello che stiamo cercando.

Problemi correlati