Ich suche nach der Datei „WSFY321.c“ in einer riesigen Verzeichnishierarchie.
Normalerweise würde ich GNU find : find . -name "WSFY321.c"
Aber ich kenne den Fall nicht, es könnte Groß-, Klein- 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"
?
Antwort
Neuere Versionen von GNU find
verfügen über ein -iname
-Flag für die Suche nach Namen ohne Berücksichtigung der Groß- und Kleinschreibung.
find . -iname "WSFY321.c"
Kommentare
- Da Sie ' Wenn Sie speziell nach einer Datei suchen, können Sie wahrscheinlich ein paar weitere Ticks mit dem Flag
-type f
rasieren, sodass sie ' Sie müssen sich nicht den Namen ansehen, wenn der Inode ein Verzeichnis ist. Aber das ' ist die pedantische Optimierungsebene … - Für die Arbeit mit einigen regulären Ausdrücken können Sie
find . -iname \*WSFY321.c\* -type f
Antwort
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 einzugeben ist:
find . -name "????321.c" | grep -i "/WSFY[^/]*$"
Oder in zsh:
print -rl -- **/(#i)WSFY321.c
Kommentare
- @Gilles Die
grep
-Version filtert nur Großbuchstaben, und ich ' t Verstehe die ' [^ /] ' .. (nicht /) - @Gilles Was ist das Argument dafür? Verwenden Sie die einfachen Anführungszeichen im ersten Fall (genauer Dateiname) über keine Anführungszeichen?
- @ Peter.O Nein
*
nach der/
in der Bash-Version. Ich meintegrep -i
. I u Verwenden Sie[^/]*
und nicht.*
, um keine Dateien in Verzeichnissen abzufangen, deren Name mitWSFY
. - @Bernhard Consistency.
- Danke Gilles: Ich habe den vorherigen Kommentar mit falscher Syntax gelöscht und die geänderte Version getestet, aber ' funktioniert nicht ohne * (aus einem unerwarteten Grund; zumindest für mich). Die Option ohne Berücksichtigung der Groß- und Kleinschreibung funktioniert nicht mehr:
shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c
… Ich nehme an, dass ' der Grund ist, warum sie als nocase bezeichnet wird glob : Es funktioniert nur im Kontext eines Globus (oder so scheint es).
Antwort
Zwei Lösungen für macOS:
Verwenden von GNU find
:
brew install findutils --with-default-names # restart Terminal find . -iname "WSFY321.c"
Verwenden von GNU sed
:
brew install gnu-sed --default-names # restart Terminal find -name "$(sed "s|\([[:alpha:]]\)|[\U\1\L\1]|g" <<<"WSFY321.c")"
Kommentare
- Unter macOS Sierra ist die Option -iname standardmäßig verfügbar.