Escludi directory in find


11

Come posso trovare tutti i file e tutte le directory corrispondenti a un modello, escludendo una directory usando find?

Supponiamo che io abbia la seguente struttura di file;

.
  foo-esclusione-me /
    foo.txt
  foo-esclusione-me-not /
    foo.txt
  bar/
    foo.txt
    foobar /
      bar.txt
      foofoo.txt

come otterrei il seguente output usando find:

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

Ho provato a utilizzare entrambi i seguenti comandi:

trova . -name 'foo-exclude-me' -prune -o -name 'foo *'
trova . -name 'foo *' \! -path './foo-exclude-me/*'

ma entrambi restituiscono questo:

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me # << this should be excluded
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

Come posso escludere correttamente la foo-exclude-medirectory?


Prova a utilizzare foo-exclude-meinvece di ./foo-exclude-me. Prova anche ad aggiungere -printalla fine del comando.
n0pe

@MaxMackie perfect :)
Tyilo

Lo ha riparato? Qual è stata la correzione che ha funzionato per te? Posso inserirlo in una risposta anziché in un commento.
n0pe

@MaxMackie usando entrambi -printe foo-exclude-meinvece di ./foo-exclude-me.
Tyilo

Fantastico, sembra che Gilles mi abbia battuto comunque :)
n0pe

Risposte:


11
find . -name 'foo-exclude-me' -prune -o -name 'foo*' -print

In caso contrario -print, l'azione predefinita implicita si applica a tutte le partite, anche quelle potate. L'esplicito si -printapplica solo alle condizioni specificate, che sono -name 'foo*'solo nel ramo else di -name 'foo-exclude-me'.

In generale, usa un esplicito -printogni volta che stai facendo qualcosa di più complesso di una congiunzione di predicati.

Il tuo secondo tentativo con ! -path './foo-exclude-me/*'non ha funzionato perché ./foo-exclude-menon corrisponde ./foo-exclude-me/*(nessun finale /). L'aggiunta ! -path ./foo-exclude-mefunzionerebbe.


-2
-bash-4.1 $ find. -exec ls -l {} + -name 'a.out' -prune -o -name '*' -exec rm -f {} + -exec ls -l {} +

-rw-r - r--. 1 oradba dba 499 18 gennaio 19:30 ./a.out
-rw-r - r--. 1 oradba dba 499 18 gennaio 20:59 ./b.out
-rw-r - r--. 1 oradba dba 499 18 gennaio 20:59 ./c.out
-rw-r - r--. 1 oradba dba, 499 18 gennaio 20:59. / Gg

.:
totale 16
-rw-r - r--. 1 oradba dba 499 18 gennaio 19:30 a.out
-rw-r - r--. 1 oradba dba, 499, 18 gennaio, 20:59 b.out
-rw-r - r--. 1 oradba dba, 499 18 gennaio 20:59 c.out
-rw-r - r--. 1 oradba dba, 499 18 gennaio 20:59 d.out
rm: impossibile rimuovere `. ': è una directory
ls: impossibile accedere ./b.out: nessun file o directory
ls: impossibile accedere ./d.out: nessun file o directory
ls: impossibile accedere ./c.out: nessun file o directory
.:
totale 4
-rw-r - r--. 1 oradba dba 499 18 gennaio 19:30 a.out


Utilizzata l'opzione di eliminazione per saltare a.out e funziona benissimo - art.s
user211226

Non spieghi assolutamente perché -pruneè rilevante. -pruneè una delle opzioni più complicate da findcausare perché disabilita -print(che è abilitato di default)
grochmal

-prune True; se il file è una directory, non scendere in esso. - Quindi non funzionerà da solo nelle directory come protezione. - art.s
user211226
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.