Sto cercando il file “WSFY321.c” in unenorme gerarchia di directory.
Di solito utilizzo GNU find : find . -name "WSFY321.c"
Ma non conosco il caso, potrebbe essere maiuscolo, minuscolo o una combinazione di entrambi.

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

Risposta

Le versioni recenti di GNU find hanno un flag -iname, per le ricerche di nomi senza distinzione tra maiuscole e minuscole.

find . -iname "WSFY321.c" 

Commenti

  • Inoltre, poiché ' stai cercando specificamente un file che puoi probabilmente eliminare un altro paio di tick con il flag -type f in modo che abbia vinto ' Non preoccuparti di guardare il nome se linode è una directory. Ma questi ' livelli di ottimizzazione pedanti …
  • Per lavorare con alcune espressioni regolari puoi fare find . -iname \*WSFY321.c\* -type f

Answer

Con GNU find, o altre versioni di find che lo 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 

Commenti

  • @Gilles La versione grep filtra solo le maiuscole e io non ' t capire il ' [^ /] ' .. (non /)
  • @Gilles Qual è largomento per utilizzare le virgolette singole nel primo caso (nome file esatto) senza virgolette?
  • @ Peter.O No * dopo / nella versione bash. Intendevo grep -i. se [^/]* anziché .* in modo da non catturare file nelle directory il cui nome inizia con WSFY.
  • @Bernhard Consistency.
  • Grazie Gilles: ho eliminato il commento precedente con una sintassi errata e ho testato la versione modificata, ma non ' t funziona senza * (per un motivo inaspettato; almeno a me). Lopzione senza distinzione tra maiuscole e minuscole non funziona più: shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c … Suppongo che ' sia il motivo per cui è chiamato nocase‍ glob : funziona solo nel contesto di un glob (o almeno così sembra).

Risposta

Due soluzioni per macOS:

Utilizzo di GNU find:

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

Utilizzo di GNU sed:

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

Commenti

  • Su macOS Sierra lopzione -iname è disponibile per impostazione predefinita.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *