2012-12-08 2 views
9

Vorrei trovare tutti i file che terminano con .c, .R o .Rd. Ho provatoTrova Unix: come abbinare i file * .R e * Rd?

find . -iname "*.[cR]" -print 

che dà tutti i file che terminano con .c o .R. Come posso ottenere anche i file .Rd? So che [] corrisponde un solo carattere, ma non riuscivo a regolarlo per fornire .Rd file così (cercato di lavorare con | o l'opzione -regex etc.)

risposta

15

Ecco qui =)

find -name "*.c" -o -name "*.R" -o -name "*.Rd" 

Se sono solo i 3 tipi di estensione che stai cercando, ti consiglio di evitare la regex e di usare semplicemente l'operatore -o (come in "o") per comporre la ricerca.

+0

Questa soluzione sembra essere dipendente dalla piattaforma: ho installato un emulatore Cygwin UNIX sul mio PC Windows, e il seguente comando find sembra funzionare: 'find ./ -name" * .exe "' e 'find ./ -name "* .dll" 'ma' find ./ -name "* .exe" -o nome "* .dll" 'sembra non funzionare. – Dominique

7

Un uso adeguato di -regex sarebbe:

find -regex '.*\.\(R\|Rd\|c\)' 

Se si desidera utilizzare le espressioni regolari è necessario tenere a mente che queste si applicano a tutto il percorso, non solo per il nome del file:

-regex pattern 
      File name matches regular expression pattern. This is a match 
      on the whole path, not a search. For example, to match a file 
      named `./fubar3', you can use the regular expression `.*bar.' or 
      `.*b.*3', but not `f.*r3'. The regular expressions understood 
      by find are by default Emacs Regular Expressions, but this can 
      be changed with the -regextype option. 

Sono d'accordo con la risposta di sampson-chen, che le regex non sono probabilmente la scelta migliore qui.