2014-09-05 16 views
37

Ich versuche, Dateien mit bestimmten Erweiterungen zu finden. Zum Beispiel möchte ich alle PDF und JPG-Dateien zu finden, die Robertrekursiv Dateien mit einer bestimmten Erweiterung finden

Ich weiß, benannt ist ich diesen Befehl tun können

$ find . -name '*.h' -o -name '*.cpp' 

aber ich brauche den Namen der Datei angeben, sich neben den Erweiterungen . Ich möchte nur sehen, ob es eine Möglichkeit gibt, den Dateinamen immer wieder zu schreiben Danke!

Antwort

48

Meine Präferenz:

find . -name '*.jpg' -o -name '*.png' -print | grep Robert

+1

Funktioniert gut, aber ein kleiner Nachteil ist, dass es verhindert, dass Sie eine 'find -exec ...' –

+0

Was ist, wenn ich alle xxx-deployment.yml-Dateien in allen Ordnern in einem bestimmten Pfad finden möchten? –

11

Mit find ‚s -regex Argumente:

find . -regex '.*/Robert\.\(h\|cpp\)$' 

Oder einfach mit -name:

find . -name 'Robert.*' -a \(-name '*.cpp' -o -name '*.h' \) 
2
find -name "*Robert*" \(-name "*.pdf" -o -name "*.jpg" \) 

Die -o repreents einen OR Zustand und Sie können so viele hinzufügen, wie Sie innerhalb der geschweiften Klammern möchten. Das heißt also, dass alle Dateien, die das Wort "Robert" enthalten, irgendwo in ihrem Namen stehen und deren Namen entweder in "pdf" oder "jpg" enden.

1

Als Alternative zur Verwendung von -regex Option auf find, da die Frage markiert ist, können Sie die Klammer Expansionsmechanismus verwenden:

eval find . -false "-o -name Robert".{jpg,pdf} 
+0

Fund Report "Pfade müssen Ausdruck vorangehen", was ist das Problem? Ich füge normalerweise Zitat hinzu, um es zu lösen, aber arbeite nicht für diesen Ausdruck. Vielen Dank! – netawater

+0

Ich vermute, entweder hast du 'eval' oder' '' im obigen Befehl vergessen, oder dein 'find' ist ein Alias ​​für etwas komplizierteres, oder du verwendest nicht das originale GNU' find' auf deiner Linux-Version. – jxh

+0

Danke für Ihre Antwort, ich habe ein Skript wie folgt verwendet: FILEEXTEIONS = cs, [ch] eval find. -false "-o-name *". {$ FILEEXTEIONS} und meldet diesen Fehler. – netawater

1

Als Skript Sie verwenden können:

find "${2:-.}" -iregex ".*${1:-Robert}\.\(h\|cpp\)$" -print 
  • speichern Sie es als findcc
  • chmod 755 findcc

und es als

findcc [name] [[search_direcory]] 

z.B.

findcc     # default name 'Robert' and directory . 
findcc Joe    # default directory '.' 
findcc Joe /somewhere # no defaults 

note you cant verwenden

findcc /some/where #eg without the name... 

auch als Alternative Sie

find "$1" -print | grep "[email protected]" 

und

findcc directory grep_options 

wie

verwenden können
findcc . -P '/Robert\.(h|cpp)$' 
Verwandte Themen