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!


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

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' \)

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.


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}

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)$'

1

Verwenden von Bash Globbing (wenn dies findkein Muss ist)

ls Robert.{pdf,jpg} 

0

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

ftype="jpg"
ls -1R *.${ftype}  2> /dev/null
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.