Ho provato a creare una stringa di comando find che troverà tutti i file che terminano con un numero 1-99 ma escluderà tutti gli altri .

es Voglio trovare myfile1 myfile99 ma non myfile456 e non myfilebackup

La regex a cui” sto pensando è myfile[1-9]{1,2} ma non riesco “a farlo funzionare con find.

find . -regex ".*myfile[0-9]{1,2}" OPPURE find . -iname "myfile[0-9]{1,2}"

Da quello che posso vedere “è la parte {1,2} che non funziona.

(a proposito puoi usare -name -regex in modo intercambiabile?)

Qualsiasi aiuto apprezzato.

Commenti

  • -iname (e -name) utilizzano glob , che non hanno questa sintassi.

Risposta

Potresti provare

find . -regex ".*myfile[0-9][0-9]?" 

o

find . \( -name "myfile[0-9][0-9]" -o -name "myfile[0-9]" \) 

Commenti

  • Grazie – la prima riga è worki ng per me. Avevo provato con -iname ma non ' penso che supporti la sintassi oppure ' sto facendo qualcosa di sbagliato.

Risposta

Se hai GNU find, puoi usare un altro tipo di espressione regolare:

find . -regextype sed -regex ".*myfile[0-9]\{1,2\}" 

Secondo GNU find utilizza un castrato Sintassi delle espressioni regolari Emacs per impostazione predefinita – Emacs supporta la sintassi \{from,to\}, ma almeno GNU find non lo supporta.

Stranamente, il manuale di riferimento non “include una sezione sulla sintassi delle espressioni regolari sed, quindi chissà quali parti di esso sono supportati.

Commenti

  • sed come ed sembra essere un alias per posix-basic, quindi dovrebbe essere compatibile con POSIX BRE (sebbene supporti alcuni ex tensioni come \+). ' non è compatibile con GNU sed dove ad esempio [\n] corrisponde a una nuova riga invece di la barra rovesciata o n richiesta da POSIX. Vedi anche -regextype posix-extended per POSIX ERE (quindi .*myfile[0-9]{1,2}), anche con estensioni come \s o \<
  • Non ho mai saputo di -regextype. Sembra che se utilizzi -regextype egrep sembra che tu possa evitare le barre rovesciate.

Lascia un commento

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