Suchen Sie rekursiv nach Dateien mit einer bestimmten Erweiterung

81

Ich versuche, Dateien mit bestimmten Erweiterungen zu finden. Zum Beispiel möchte ich alle PDF- und JPG-Dateien mit dem Namen Robert finden

Ich weiß, dass ich diesen Befehl ausführen kann

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

aber ich muss den Namen der Datei selbst neben den Erweiterungen angeben. Ich möchte nur sehen, ob es eine Möglichkeit gibt, das Schreiben des Dateinamens nicht immer wieder zu vermeiden. Danke!

A1X
quelle
4
Jeder, der diesen oder einen darunter liegenden Befehl kopiert, sollte inamestattdessen verwenden - wobei die Groß- und Kleinschreibung nicht berücksichtigt wird .
Addison
Guter Punkt, Addison (daher die +1). Es scheint jedoch, dass das OP Dateien mit dem Namen "Robert" mit einem Großbuchstaben "R" möchte. Wenn ich den Beitrag interpretiere, bedeutet dies, dass Dateien, die 'robert' enthalten, NICHT ausgegeben werden sollten. " R obert" steht geschrieben. Es gibt jedoch Situationen, in denen jemand möchte, dass entweder "Robert" oder "Robert" gefunden wird. Vielleicht ist das OP in dieser Situation. Ob Sie verwenden inameoder namehängt davon ab, was Sie finden möchten. Ich war in Situationen, in denen der Fall wesentlich war.
bballdave025

Antworten:

101

Meine Vorliebe:

find . -name '*.jpg' -o -name '*.png' -print | grep Robert
Nebliger Tag
quelle
2
Funktioniert gut, aber ein kleiner Nachteil ist, dass es Sie daran hindert, einfind -exec ...
Mark Setchell
Was ist, wenn ich alle xxx-deploy.yml-Dateien in allen Ordnern in einem bestimmten Pfad finden möchte?
Naim Salameh
Dies funktioniert nicht so gut, wenn Sie jpgoder pngals Teil eines längeren Pfades.
AutonomousApps
18

Mit finddem -regexArgument von:

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

Oder einfach nur benutzen -name:

find . -name 'Robert.*' -a \( -name '*.cpp' -o -name '*.h' \)
Etan Reisner
quelle
4
find -name "*Robert*" \( -name "*.pdf" -o -name "*.jpg" \)

Das -ostellt eine ORBedingung dar und Sie können so viele hinzufügen, wie Sie möchten. Das heißt also, alle Dateien zu finden, die das Wort "Robert" irgendwo in ihren Namen enthalten und deren Namen entweder mit "pdf" oder "jpg" enden.

Mark Setchell
quelle
3

Alternativ zur Verwendung der -regexOption ein find, da die Frage beschriftet istkönnen Sie den Klammererweiterungsmechanismus verwenden:

eval find . -false "-o -name Robert".{jpg,pdf}
jxh
quelle
find report "Pfade müssen dem Ausdruck vorausgehen", was ist das Problem? Normalerweise füge ich ein Zitat hinzu, um das Problem zu beheben, arbeite aber nicht für diesen Ausdruck. Vielen Dank!
Netawater
Ich vermute, Sie haben entweder vergessen evaloder den .obigen Befehl verwendet, oder Sie findsind ein Alias ​​für etwas Komplizierteres, oder Sie verwenden die Standard-GNU nicht findfür Ihre Linux-Version.
JXH
Vielen Dank für Ihre Antwort. Ich habe ein Skript wie das folgende verwendet: FILEEXTEIONS = cs, [ch] eval find. -false "-o -name *". {$ FILEEXTEIONS} und meldet diesen Fehler.
Netawater
Soweit ich weiß, tritt innerhalb der Klammer-Expansionsklammern keine variable Expansion auf.
jxh
1
Ich wollte diese Technik in einer Android-Shell verwenden, aber findsie wird nicht unterstützt -false. Ich habe das umgangen, indem ich zwei sich gegenseitig ausschließende Bedingungen angegeben habe, damit sie kollektiv falsch sind : -inum 1 -inum 2.
Sternenfrucht
1

Als Skript können Sie Folgendes verwenden:

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

und benutze es als

findcc [name] [[search_direcory]]

z.B

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

Beachten Sie, dass Sie nicht verwenden können

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

alternativ können Sie auch verwenden

find "$1" -print | grep "$@" 

und

findcc directory grep_options

mögen

findcc . -P '/Robert\.(h|cpp)$'
jm666
quelle
1

Verwenden von Bash Globbing (wenn dies findkein Muss ist)

ls Robert.{pdf,jpg} 
Einmal
quelle
0

Wiederholt mit ls: (-al für versteckte Ordner einschließen)

ftype="jpg"
ls -1R *.${ftype}  2> /dev/null
wuseman
quelle