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 meinte grep -i. I u Verwenden Sie [^/]* und nicht .*, um keine Dateien in Verzeichnissen abzufangen, deren Name mit WSFY.
  • @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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.