Trova comando: come ignorare il caso?


171

Sto cercando il file "WSFY321.c" in una grande gerarchia di directory.
Di solito userei GNU find : find . -name "WSFY321.c"
ma non conosco il caso, potrebbe essere maiuscolo, minuscolo o un mix di entrambi.

Qual è il modo più semplice per trovare questo file?
C'è qualcosa di meglio di find . | grep -i "WSFY321.c"?

Risposte:


216

Le versioni recenti di GNU findhanno un -inameflag, per ricerche di nomi senza distinzione tra maiuscole e minuscole.

find . -iname "WSFY321.c"

6
Inoltre, poiché stai specificatamente cercando un file, probabilmente puoi eliminare un altro paio di segni di spunta con il -type fflag in modo che non si preoccupi di guardare il nome se l'inode è una directory. Ma sono livelli pedanti di ottimizzazione ...
Shadur,

Per lavorare con un po 'di regex puoi farlofind . -iname \*WSFY321.c\* -type f
Benj,

40

Con GNU find o altre versioni di find che ce l'hanno:

find . -iname 'WSFY321.c'

Con altre versioni:

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

O un compromesso più lento ma più facile da digitare:

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

O in zsh:

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

@Gilles La grepversione filtra solo lettere maiuscole e non capisco il '[^ /]' .. (not /)
Peter.O

@Gilles Qual è l'argomento per utilizzare le virgolette singole nel primo caso (nome file esatto) piuttosto che senza virgolette?
Bernhard,

@ Peter.O No *dopo il /nella versione bash. Intendevo grep -i. Uso [^/]*piuttosto che .*per non catturare i file nelle directory il cui nome inizia con WSFY.
Gilles,

5
@Bernhard Coerency.
Gilles,

Grazie Gilles: ho cancellato il commento precedente con una sintassi errata e testato la versione ammended, ma non funziona senza il * (per un motivo inaspettato; almeno per me). L'opzione di maiuscole e minuscole non funziona più: shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c... Suppongo che sia il motivo per cui è chiamato un nocase glob : funziona solo nel contesto di un glob (o almeno così sembra).
Peter

1

Due soluzioni per macOS:

Usando GNU find:

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

Usando GNU sed:

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

1
Su macOS Sierra l'opzione -iname è disponibile per impostazione predefinita.
ThomasW,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.