2011-01-10 14 views
7

ho questo comando:Regex per le cifre in Unix trovare comando

find reports/ -type f -mtime +90 -regex ".*\.\(csv\|sql\|txt\|xls\|zip\)" 

E ho bisogno di rinforzare l'alto in modo che la parte prima che le estensioni di file corrisponde a un modello YYYY/MM/DD, in questo modo:

reports/2010/10/10/23.txt 
reports/2010/10/10/23.xls 
reports/2010/10/10/26.csv 
reports/2010/10/10/26.sql 
reports/2010/10/10/26.txt 
reports/2010/10/10/26.xls 
reports/2010/10/10/27.csv 

Ma non riesco a ottenere alcuna permutazione di \d e parenti che scappano al lavoro.

UPDATE: ecco cosa ha funzionato per me in base alla risposta accettato di seguito:

find reports/ -type f -mtime +90 -regex "reports/201[01]/\([1-9]\|1[012]\)/\([1-9]\|[12][0-9]\|3[01]\)/.*\.\(csv\|sql\|txt\|xls\|zip\)" 
+0

Si noti che l'opzione -regex non è standard nelle piattaforme Unix. Penso che potrebbe essere solo su GNU find. È possibile eseguire un metodo più standard eseguendo il piping dell'output su egrep. – JOTN

risposta

5

Questo è quello che ho usato in passato:

Year: (19|20)[0-9][0-9] 
Month: 0[1-9]|1[012] 
Day: (0[1-9]|[12][0-9]|3[01]) 

È possibile inserire questi insieme nella tua regex. Ovviamente, dovrai sfuggire alle staffe e ai tubi.

3

\d è un'estensione di espressioni regolari che non è supportato da Emacs espressioni regolari e POSIX espressioni regolari (quelli sono il sapori find supporti). È invece possibile utilizzare [[:digit:]] o [0-9].

+1

Puoi usare '[0-9]', ma se puoi usare '[[: digit:]]' dipende da quale '-regextype' usi. Ad esempio, 'emacs' (il tipo predefinito) non lo supporta mentre' posix-extended' lo fa. Vedi [Manuale GNU findutils: 8.5 Regular Expressions] (https://www.gnu.org/software/findutils/manual/html_node/find_html/Regular-Expressions.html) per le descrizioni della sintassi collegate in fondo. – zpea

3

Quello che segue è brutto e non estirpare le date non valide, ma potrebbe essere abbastanza vicino:

find reports/ -type f -regex ".*/reports/[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]/[0-9][0-9]\.\(csv\|sql\|txt\|xls\|zip\)" 
+0

Sembra buono (e lo proverò tra un po ') ma è possibile stringere gli intervalli con qualcosa come "[0-9] {4}" invece di ripeterlo quattro volte di seguito? –

+0

Il quantificatore numerico "{4}" non sembra funzionare con la versione di 'regexec' nella versione di' libc' usata da 'find' sul mio sistema (libc 2.3.4). YMMV. –

0

È possibile utilizzare i ripetitori in questo modo:

find ./ -regextype posix-egrep -iregex ".*\._[0-9]{8}-[0-9]{6}.*" 

Io lo uso per trovare un backup di forma:

./foo._20140716-121745.OLD 

Dove foo è il nome originale ed i numeri sono la data e l'ora .

(su CentOS 6.5)

P.S. -regextype posix-extended funziona anche.