2013-06-03 10 views
5

Ich möchte alle versteckten Dateien, insbesondere .git und .svn ignorieren, wenn ich Dateien suche (und später ersetze), aber nicht gefunden habe, dass die einfachste Art, solche versteckten Dateien auszuschließen, die in vielen Online-Tutorials beschrieben werden, nicht funktioniert Hier.Warum findet man? -nicht -name ". *" schließt versteckte Dateien nicht aus?

find . -not -name ".*" 

wird auch versteckte Dateien drucken.

Das Skript, das ich zu schreiben bin versucht

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

'finden. -nicht -name ". *" 'funktioniert mir. – fedorqui

+0

Verwenden Sie 'finden. -nicht -name '. *' ', um Shell-Erweiterungen zu vermeiden. – Rubens

+0

um genau zu sein, es findet immer noch (nicht versteckte) Dateien in versteckten Verzeichnissen. – user1273684

Antwort

9

Die Sache ist -not -name ".*" alle Dateien und Verzeichnisse übereinstimmt, die mit etwas beginnen, aber „“ - Aber sie werden nicht von der Suche abgeschnitten, sodass Sie Treffer aus versteckten Verzeichnissen erhalten. Beschneiden -prune Pfade verwenden, das heißt:

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

(Ich benutze $PWD weil sonst der Beginn der Suche auch beschnitten werden würde und es gäbe keine Ausgabe „“)

+0

Danke, aber ich bin immer noch ein wenig verloren - warum '' finden $ PWD -name '. *' -prune -o-name '* .c' -type f -print' arbeiten, aber nicht 'finden $ PWD - name '. *' -prune -o $ expr -type f -print mit 'expr =" - name '* .c' "'? – user1273684

+1

Die Anführungszeichen, die Sie in den Ausdruck 'expr' einbetten, werden nicht entfernt, nachdem' expr' erweitert wurde. Sie werden buchstäblich behandelt. – chepner

+0

danke, jetzt funktioniert es – user1273684

0

richtige Version

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 
} 
Verwandte Themen