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
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śligrep -i
. se[^/]*
zamiast.*
, aby nie przechwytywać plików w katalogach, których nazwa zaczyna się odWSFY
. - @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.
-type f
, aby wygrał ' nie zawracaj sobie głowy sprawdzaniem nazwy, jeśli i-węzeł jest katalogiem. Ale to ' poziomy optymalizacji …find . -iname \*WSFY321.c\* -type f