Suchbefehl: Wie ignoriere ich Groß- / Kleinschreibung?

170

Ich suche die Datei "WSFY321.c" in einer riesigen Verzeichnishierarchie.
Normalerweise würde ich GNU find verwenden : find . -name "WSFY321.c"
Aber ich kenne den Fall nicht, es könnte Großbuchstaben, Kleinbuchstaben oder eine Mischung aus beiden sein.

Was ist der einfachste Weg, um diese Datei zu finden?
Gibt es etwas besseres als find . | grep -i "WSFY321.c"?

Nicolas Raoul
quelle

Antworten:

214

Neuere Versionen von GNU findhaben ein -inameFlag für die Suche nach Namen, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird.

find . -iname "WSFY321.c"
Lars Rohrbach
quelle
6
Da Sie speziell nach einer Datei suchen, können Sie wahrscheinlich noch ein paar Häkchen mit dem -type fFlag entfernen, damit es nicht stört, nach dem Namen zu suchen, wenn es sich bei der Inode um ein Verzeichnis handelt. Aber das ist ein
umständliches
Für die Arbeit mit etwas Regex können Sie tunfind . -iname \*WSFY321.c\* -type f
Benj
40

Mit GNU find oder anderen Versionen von find, die es haben:

find . -iname 'WSFY321.c'

Mit anderen Versionen:

find . -name '[Ww][Ss][Ff][Yy]321.[Cc]'

Oder ein Kompromiss, der langsamer, aber einfacher zu tippen ist:

find . -name '????321.c' | grep -i '/WSFY[^/]*$'

Oder in zsh:

print -rl -- **/(#i)WSFY321.c
Gilles
quelle
@ Gilles Die grepVersion filtert nur Großbuchstaben, und ich verstehe das '[^ /]' nicht .. (not /)
Peter.O
@Gilles Was ist das Argument, um die einfachen Anführungszeichen im ersten Fall (exakter Dateiname) vor gar keinen Anführungszeichen zu verwenden?
Bernhard
@ Peter.O Nein *nach der /in der Bash-Version. Ich meinte grep -i. Ich benutze es [^/]*lieber .*, um keine Dateien in Verzeichnissen abzufangen, deren Name mit "" beginnt WSFY.
Gilles
5
@ Bernhard Konsistenz.
Gilles
Danke Gilles: Ich habe den vorherigen Kommentar mit falscher Syntax gelöscht und die geänderte Version getestet, aber ohne das * funktioniert es nicht (aus einem unerwarteten Grund; zumindest für mich). Die Groß- und Kleinschreibung Option nicht mehr funktioniert: shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c... Ich nehme an, das ist , warum es eine genannt wird nocase glob : Es funktioniert nur in Zusammenhang mit einer glob (so scheint es).
Peter.O
1

Zwei Lösungen für macOS:

GNU benutzen find:

brew install findutils --with-default-names
# restart Terminal
find . -iname 'WSFY321.c'

GNU benutzen sed:

brew install gnu-sed --default-names
# restart Terminal
find -name "$(sed 's|\([[:alpha:]]\)|[\U\1\L\1]|g' <<<'WSFY321.c')"
Drew Beres
quelle
1
Unter macOS Sierra ist die Option -iname standardmäßig verfügbar.
ThomasW