2011-01-10 9 views
7

mam polecenie:Regex dla cyfr Unix znaleźć polecenie

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

I muszę rozbudować go tak część przed rozszerzeń plików dopasowuje YYYY/MM/DD wzór, tak jak poniżej:

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 

Ale nie udało mi się uzyskać żadnej permutacji \d i parens ucieka do pracy.

UPDATE: oto co pracował dla mnie na podstawie zaakceptowanej odpowiedzi poniżej:

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

Uwaga: opcja -regex nie jest standardem na platformach Unix. Myślę, że może to być tylko na GNU find. Możesz zrobić bardziej standardową metodę, wyprowadzając wyjście do egrep. – JOTN

Odpowiedz

5

To właśnie użyłem w przeszłości:

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

Można umieścić je razem w swoim regex. Będziesz musiał oczywiście uciec przed nawiasami i rurami.

3

\d jest przedłużeniem wyrażeń regularnych, który nie jest obsługiwany przez wyrażenia regularne Emacs i wyrażeń regularnych POSIX (te są smaki find obsługuje). Zamiast tego możesz użyć [[:digit:]] lub [0-9].

+1

Możesz użyć '[0-9]', ale jeśli możesz użyć '[[: cyfra:]]' zależy od używanego '-regextype'. Na przykład 'emacs' (typ domyślny) nie obsługuje go, natomiast' posix-extended' ma. Zobacz [GNU findutils manual: 8.5 Wyrażenia regularne] (https://www.gnu.org/software/findutils/manual/html_node/find_html/Regular-Expressions.html), aby uzyskać opisy składni na dole. – zpea

3

Poniżej jest brzydki i nie wyeliminować nieprawidłowe daty, ale może być wystarczająco blisko:

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

To wygląda dobrze (i przetestuję to trochę), ale czy możliwe jest zaostrzenie zakresów z czymś takim jak "[0-9] {4}" zamiast powtarzania go cztery razy z rzędu? –

+0

Kwantyfikator liczbowy "{4}" prawdopodobnie nie działał z wersją 'regexec' w wersji' libc' używanej przez 'find' w moim systemie (libc 2.3.4). YMMV. –

0

Można użyć wzmacniaczy tak:

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

Używam tego znaleźć kopie zapasowe w postaci:

./foo._20140716-121745.OLD 

Gdzie foo to oryginalna nazwa i numery są data i czas .

(na CentOS 6.5)

P.S. -regextype posix-extended też działa.

Powiązane problemy