elenca tutti i file più recenti del timestamp indicato e ordinali


8

Voglio elencare tutti i file (ordinati per data) che sono più recenti del timestamp nel formato solo 20130207003851nella directory / tmp. Le sottodirectory possono essere omesse.

Utilizzo di SUSE Linux Enterprise Server 11.

Il formato di output dovrebbe essere

S0002948.LOG Feb  7 03:28 
S0002935.LOG Feb  7 05:58 
S0002952.LOG Feb  7 09:58 
S0002940.LOG Feb  7 11:58 

find / tmp -newermt "7 feb 2013" -ls elenca i file che voglio ma

  • come posso usare il timestamp in un formato 20130207003851
  • come posso ordinare l'output?
  • come posso visualizzare solo il nome e la data del file. Prima il nome del file e poi la data?

ps Non voglio usare il tocco per creare un file di riferimento per la ricerca

pss

find -newermt "20130207003851" -ls
find: I cannot figure out how to interpret `20130207003851' as a date or time

Cosa 2013007000385dovrebbe rappresentare? Immagino che il 2013 sia l'anno, ma come si arriva dal 0070003857 febbraio?
Gilles 'SO- smetti di essere malvagio' il

@Gilles: Supponiamo di esserlo 20130207003851. Non l'ho copiato correttamente o ... mi dispiace per quello.
Radek,

Risposte:


10

findsupporta molti formati di input data . Il formato più semplice da ottenere è AAAAMMGG HH: MM: SS. Hai già le cifre nell'ordine giusto, tutto quello che devi fare è estrarre il primo gruppo ( ${timestamp%??????}: prendi tutti tranne gli ultimi 6 caratteri;: ${timestamp#????????}prendi tutti tranne i primi 8 caratteri), e continua, aggiungendo la punteggiatura poi il gruppo successivo mentre vai avanti.

timestamp=20130207003851
timestring=${timestamp%??????}; timestamp=${timestamp#????????}
timestring="$timestring ${timestamp%????}"; timestamp=${timestamp#??}
timestring="$timestring:${timestamp%??}:${timestamp#??}"

In bash (e ksh e zsh), ma non in ash, puoi usare il ${STRING_VARIABLE:OFFSET:LENGTH}costrutto più leggibile .

timestring="${timestamp:0:8} ${timestamp:8:2}:${timestamp:10:2}:${timestamp:12:2}"

Per ordinare i file per data, stampare i nomi dei file preceduti dalle date e ordinarli, quindi rimuovere il prefisso della data. Utilizzare -printfper controllare il formato di output. stampa una parte del tempo di modifica determinato da ; se lo è , ottieni il numero di secondi dall'epoca di Unix. Di seguito stampo tre colonne separate da tabulazioni: l'ora in formato ordinabile, il nome del file e l'ora in formato leggibile dall'uomo; rimuove la prima colonna e la chiamata per sostituire la scheda con spazi sufficienti per accogliere tutti i nomi di file previsti (regolare 40 come desiderato). Questo codice presuppone che non ci siano nuove righe o schede nei nomi dei file.%TXXX@cut -f 2-expand

find -maxdepth 1 -type f \
     -newermt "$timestring" -printf '%T@\t%f\t%Tb %Td %TH:%TM\n' |
sort -k1n |
cut -f 2- |
expand -t 40

solo la parte find find -newermt "$timestring" -printf '%M@\t%f %Mb %Md %MH:%MM\n'mi dà un output divertente-rwxrwxrwx@ S0002975.LOG -rwxrwxrwxb -rwxrwxrwxd -rwxrwxrwxH:-rwxrwxrwxM
Radek,

@Radek Siamo spiacenti, è %Tper il momento, %Mè le autorizzazioni.
Gilles 'SO- smetti di essere malvagio' il

Bellissimo. Funziona senza problemi. Il mio ultimo codice è che find /tmp -maxdepth 1 -type f -newermt "20130207 00:38:51" -printf '%T@\t%f-%Tb %Td %TH:%TM\n' | sort -k1n | cut -f 2-ho separato il nome e l'ora del file -perché catturerò l'output in php e lo userò come separatore. Grazie mille.
Radek,

@Gilles è fantastico, ma se spieghi il tempo, ti aiuterà di più ..
Rahul Patil,

@RahulPatil Fatto. Ho anche aggiunto un metodo bash più leggibile.
Gilles 'SO- smetti di essere malvagio' il

5

Con zsh:

zmodload zsh/stat
newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY && (( t >= timestamp ))
}
timestamp=20130207003851
print -rl -- /tmp/*(D.Om+newer)

Le newerfunzione restituisce True per i file più recenti rispetto $timestamp(notare che zsh's zstatnon supporta la precisione inferiore al secondo però).

Quindi tutto ciò che facciamo è usare i zshqualificatori globbing: Dper includere file dot, .considerare solo file regolari, Omordinare in tempo di modifica e +newerchiamare la newerfunzione per determinare quale file selezionare.

Se si desidera visualizzare anche i timestamp dei file, è possibile passare newera:

newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY &&
    REPLY+=$'\t'$t &&
    (( t >= timestamp ))
}

Si noti tuttavia che il risultato della generazione del nome file includerà i timestamp, il che significa che non è più possibile utilizzarli come nomi di file.


questo non funzionerà ssh, per esempio.
evandrix,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.