2013-06-03 12 views
5

Voglio ignorare tutti i file nascosti, ma soprattutto .git e .svn durante la ricerca (e più tardi sostituendo) i file, non ho trovato che il modo più semplice per escludere tali file nascosti descritti in molti tutorial online non funziona Qui.Perché trova. -not -name ". *" non esclude i file nascosti?

find . -not -name ".*" 

stampa anche file nascosti.

Lo script che sto cercando di scrivere è

replace() { 
    if [ -n "$3" ]; then expr="-name \"$3\""; fi 
    find . -type f \($expr -not -name ".*" \) -exec echo sed -i \'s/$1/$2/g\' {} \; 
    unset expr 
} 
+0

'trova. -not -name ". *" 'funziona per me. – fedorqui

+0

Usa 'trova. -not -name '. *' ', per evitare l'espansione della shell. – Rubens

+0

per la precisione, trova ancora i file (non nascosti) nelle directory nascoste. – user1273684

risposta

9

La cosa è -not -name ".*" non corrispondere tutti i file e le directory che iniziano con tutt'altro "" - ma non li elimina dalla ricerca, quindi otterrai le corrispondenze dalle directory nascoste. Per potare i percorsi utilizzano -prune, vale a dire:

find $PWD -name ".*" -prune -o -print 

(io uso $PWD perché altrimenti l'inizio della ricerca sarebbe anche essere potata e non ci sarebbe alcuna uscita "")

+0

Grazie, ma sono ancora un po 'perso - perché 'trova $ PWD -name'. * '-prune -o -name' * .c '-type f -print' funziona ma non' trova $ PWD - nome '. *' -prune -o $ expr -type f -print' con 'expr =" - name '* .c' "' '? – user1273684

+1

Le virgolette inserite nel valore di 'expr' non vengono rimosse dopo che' expr' è stato espanso; sono trattati letteralmente. – chepner

+0

grazie, ora funziona – user1273684

0

versione corretta

replace() { 
     if [ -n "$3" ]; then expr=-name\ $3; fi 
     find $PWD -name '.*' -prune -o $expr -type f -exec sed -i s/$1/$2/g {} \; 
     unset expr 
}