2013-02-05 10 views
13

Ho un set di file in una directory. Ho bisogno di trovare i file per un insieme di date specifiche (per esempio se ho bisogno di file dal 16 gennaio al 20 gennaio). Ho provato a utilizzare ls -ltr | grep <date> ma sono necessari troppi passaggi per eseguire la selezione dei file. C'è un modo più semplice per ottenere questo risultato. Grazie!Come usare ls per trovare i file per una serie specifica di date in Unix

+0

Shash, hanno un pensare la risposta accettata, penso ritrovamento possa essere uno strumento migliore per il lavoro. – paxdiablo

+0

@paxdiablo Ok, proverò anche a quello – Shash

risposta

20

Non sono sicuro di quanti file avete nel vostro directory, ma qualcosa di simile a questo dovrebbe essere veloce come il fulmine:

ls -al | awk '$6 == "Jan" && $7 >= 16 && $7 <= 20 {print $9}' 

Sul mio sistema, vedo il seguente con date leggermente modificati :

pax> ls -al | awk '$6 == "Jan" && $7 >= 16 && $7 <= 29 {print $9}' 
kids_shares.ods 
our_savings.gnumeric 
photos 

pax> ls -ald kids_shares.ods our_savings.gnumeric photos 
-rw-r--r-- 1 pax pax 51005 Jan 29 19:39 kids_shares.ods 
-rw-r--r-- 1 pax pax 2275 Jan 28 14:48 our_savings.gnumeric 
drwxrwxrwx 130 pax pax 4096 Jan 29 21:47 photos 

È possibile vedere che le date corrispondono ai file specificati.

Una cosa a cui prestare attenzione: se il file è recente, avrà un tempo nella colonna 8. Oltre qualche età, ls inizia a mettere l'anno lì. Ho il vago ricordo che è da qualche parte intorno al confine di sei mesi, ma non ne sono assolutamente certo. Avrai bisogno di provvedere anche a quello.

+1

ha funzionato alla grande ... – Shash

9

Utilizzare invece find(1), sarà molto più semplice.

find . -mtime -$start -mtime +$end 
+0

'find' ha un flag' -newer' (per vedere se è più recente di un altro file) ma sfortunatamente non uno '-older'. Non sono sicuro che sia adatto a questi intervalli di date molto specifici. – paxdiablo

+0

@paxdiablo è adatto, ho appena aggiunto un esempio (anche, find ha l'operatore '!' (Not)) – wich

+0

Ooh, non ci avevo pensato. Buona chiamata – paxdiablo

7

È meglio usare find. Inizia creando due file temporanei con orari specifici da cercare tra. touch può fare questo:

touch -t "201301160001" ./start 
touch -t "201301202359" ./finish 

Poi gestita find:

find /path/to/files -type f -newer ./start ! -newer ./finish 
+0

In realtà, entrambe queste soluzioni basate sulla ricerca sono probabilmente migliori delle mie - potrebbe essere necessario utilizzare maxdepth se non si desidera entrare nelle sottodirectory. +1 per entrambi. – paxdiablo

+0

@paxdiablo: Grazie amico. Ho ricambiato perché (anche se preferisco non analizzare l'output di 'ls') l'OP _did_ vuole farlo in quel modo, e' awk' è stata una buona scelta. – Steve

+0

Questo funziona perfettamente per me in modo interattivo, ma non restituisce alcun risultato se usato in uno script (con './Script.sh',' bash script.sh' o 'source script.sh'). Penso che abbia a che fare con il botto; quando uso 'bash -x' a debug, è circondato da virgolette singole; eseguire il comando in questo modo non restituisce nulla. – rensa

Problemi correlati