Szukam pliku „WSFY321.c” w ogromnej hierarchii katalogów.
Zwykle używałbym GNU find : find . -name "WSFY321.c"
Ale nie znam wielkości liter, może to być wielkie, małe litery lub połączenie obu.

Jaki jest najłatwiejszy sposób na znalezienie tego pliku?
Czy jest coś lepszego niż find . | grep -i "WSFY321.c"?

Odpowiedź

Najnowsze wersje GNU find mają flagę -iname do wyszukiwania nazw bez rozróżniania wielkości liter.

find . -iname "WSFY321.c" 

Komentarze

  • Ponadto, ponieważ ' konkretnie szukasz pliku, który możesz prawdopodobnie zgolić jeszcze kilka znaczników za pomocą flagi -type f, aby wygrał ' nie zawracaj sobie głowy sprawdzaniem nazwy, jeśli i-węzeł jest katalogiem. Ale to ' poziomy optymalizacji …
  • Aby pracować z niektórymi wyrażeniami regularnymi, możesz wykonać find . -iname \*WSFY321.c\* -type f

Odpowiedź

Z GNU find lub innymi wersjami find, które je zawierają:

find . -iname "WSFY321.c" 

W innych wersjach:

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

Lub kompromis, który jest wolniejszy, ale łatwiejszy do wpisania:

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

Lub w zsh:

print -rl -- **/(#i)WSFY321.c 

Komentarze

  • @Gilles Wersja grep filtruje tylko wielkie litery, a ja nie ' t zrozumieć ' [^ /] ' .. (nie /)
  • @Gilles Jaki jest argument do używać pojedynczych cudzysłowów w pierwszym przypadku (dokładna nazwa pliku) zamiast żadnych cudzysłowów?
  • @ Peter.O Nie * po / w wersji bash. Miałem na myśli grep -i. se [^/]* zamiast .*, aby nie przechwytywać plików w katalogach, których nazwa zaczyna się od WSFY.
  • @Bernhard Consistency.
  • Dzięki Gilles: Usunąłem poprzedni komentarz z nieprawidłową składnią i przetestowałem poprawioną wersję, ale nie ' t działa bez * (z nieoczekiwanego powodu; przynajmniej dla mnie). Opcja bez uwzględniania wielkości liter już nie działa: shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c … Przypuszczam, że ' dlatego nazywa się to nocase‍ glob : działa tylko w kontekście globu (a przynajmniej tak się wydaje).

Odpowiedź

Dwa rozwiązania dla macOS:

Używanie GNU find:

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

Korzystanie z GNU sed:

brew install gnu-sed --default-names # restart Terminal find -name "$(sed "s|\([[:alpha:]]\)|[\U\1\L\1]|g" <<<"WSFY321.c")" 

Komentarze

  • W systemie MacOS Sierra opcja -iname jest dostępna domyślnie.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *