2013-05-06 2 views
62

Non riesco a trovare come stampare la data di un file. Sono così in grado di stampare tutti i file in una directory, ma ho bisogno di stampare le date con esso.Stampa l'ultima data di modifica di un file in Bash

So che ho bisogno di allegare un formato data con l'eco della voce, ma non riesco a trovare il formato corretto.

echo "Please type in the directory you want all the files to be listed" 

read directory 

for entry in "$directory"/* 
do 
    echo "$entry" 
done 
+1

leggere -p "Si prega di inserire nella directory si desidera che tutti i file necessari per essere incluso" directory – CousinCocaine

risposta

75

È possibile utilizzare il comando stat

stat -c %y "$entry" 

Maggiori informazioni

 
%y time of last modification, human-readable 
+0

'per l'iscrizione nel "$ directory"/ * do stat -c % y "$ entry" done' Non funziona. Stampa stat: manca l'operando nel terminale – Hokerie

+0

Hm, potrebbe essere il mio unbuntu? Sai quali sono i requisiti per usare 'stat'? – Hokerie

+20

Nota che su OS X (Mac), è 'stat -f"% m% t% Sm% N "nomefile' (vedi 'man stat' ** esempi ** per maggiori dettagli) – Olie

5

Aggiungendo a @StevePenny risposta, si potrebbe desiderare di tagliare il non-così-leggibile parte:

stat -c%y Localizable.strings | cut -d'.' -f1 
1

Se il nome del file non ha spazi:

ls -l <dir> | awk '{print $6, " ", $7, " ", $8, " ", $9 }' 

Questa stampa come il seguente formato:

Dec 21 20:03 a1.out 
Dec 21 20:04 a.cpp 

Se i nomi dei file hanno spazio (è possibile utilizzare il seguente comando per i nomi di file senza spazi troppo , solo che sembra complicato/brutta di quella precedente):

ls -l <dir> | awk '{printf ("%s %s %s ", $6, $7, $8); for (i=9; i<=NF; i++){ printf ("%s ", $i)}; printf ("\n")}' 
+0

Ah, capisco! Questo funziona principalmente, ad eccezione dei file con gli spazi nei nomi. C'è una soluzione per questo? – Hokerie

+0

modificato la risposta ... pls provatelo. – Bill

+0

In realtà, ho provato di nuovo, e non funziona ... risulta che stavo provando una directory che aveva nomi di file senza spazi. =/Modificata la mia risposta sotto – Hokerie

2

CURA: scopre che avevo dimenticato le virgolette necessarie per $entry per stampare correttamente e non dare l'errore "nessun file o directory". Grazie mille per avermi aiutato!

Ecco il mio codice finale:

echo "Please type in the directory you want all the files to be listed with last modified dates" #bash can't find file creation dates 

read directory 

for entry in "$directory"/* 

do 
modDate=$(stat -c %y "$entry") #%y = last modified. Qoutes are needed otherwise spaces in file name with give error of "no such file" 
modDate=${modDate%% *} #%% takes off everything off the string after the date to make it look pretty 
echo $entry:$modDate 

Stampe come questo:

/home/joanne/Dropbox/cheat sheet.docx:2012-03-14 
/home/joanne/Dropbox/Comp:2013-05-05 
/home/joanne/Dropbox/Comp 150 java.zip:2013-02-11 
/home/joanne/Dropbox/Comp 151 Java 2.zip:2013-02-11 
/home/joanne/Dropbox/Comp 162 Assembly Language.zip:2013-02-11 
/home/joanne/Dropbox/Comp 262 Comp Architecture.zip:2012-12-12 
/home/joanne/Dropbox/Comp 345 Image Processing.zip:2013-02-11 
/home/joanne/Dropbox/Comp 362 Operating Systems:2013-05-05 
/home/joanne/Dropbox/Comp 447 Societal Issues.zip:2013-02-11 
111

Non è la 'data' comandare molto più semplice? Non c'è bisogno di awk, stat, ecc

date -r <filename> 
+8

Molto più semplice quindi usare stat/più disponibili. – Ing

+9

Sembra che il 'date' di BSD (o almeno OS X) non abbia questo. Il suo '-r' è appena usato per fornire un timestamp da formattare. Dovrai usare la data di GNU per ottenere questa funzionalità. –

+3

In uso OSX: data 'stat -f"% Sm "-t"% m% d% H% M% y "" $ {1} "' – Michaelangel007

6

Su OS X, mi piace la mia data di essere nel formato YYYY-MM-DD HH:MM nell'output per il file.

Quindi, per specificare un file userei:

stat -f "%Sm" -t "%Y-%m-%d %H:%M" [filename] 

Se voglio farlo funzionare su una serie di file, posso fare qualcosa di simile:

#!/usr/bin/env bash 
for i in /var/log/*.out; do 
    stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i" 
done 

questo esempio stamperà l'ultima volta che ho eseguito il comando sudo periodic daily weekly monthly mentre fa riferimento ai file di registro.


Per aggiungere i nomi dei file in ogni data, vorrei eseguire il seguente invece:

#!/usr/bin/env bash 
for i in /var/log/*.out; do 
    stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i" 
    echo "$i" 
done 

L'uscita sarebbe stata la seguente:

2016-40-01 16:40 
/var/log/daily.out 
2016-40-01 16:40 
/var/log/monthly.out 
2016-40-01 16:40 
/var/log/weekly.out 

Purtroppo io non sono sicuro di come per prevenire l'interruzione di riga e mantenere il nome del file aggiunto alla fine della data senza aggiungere più righe allo script.


PS - Io uso #!/usr/bin/env bash come io sono un utente Python di giorno, e hanno diverse versioni di bash installato sul mio sistema, invece di #!/bin/bash

2

Per le interruzioni di riga ho modificato il codice per ottenere qualcosa senza interruzioni di linea.

#!/bin/bash 
    for i in /Users/anthonykiggundu/Sites/rku-it/*; do 
     t=$(stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i") 
     echo $t : "${i##*/}" # t only contains date last modified, then only filename 'grokked'- else $i alone is abs. path   
    done 
1

Desidero ottenere la data di modifica di un file nel formato YYYYMMDDHHMMSS. Ecco come ho fatto:

date -d @$(stat -c %Y myfile.css) +%Y%m%d%H%M%S 

Spiegazione. E 'la combinazione di questi comandi:

stat -c %Y myfile.css # Get the modification date as a timestamp 
date -d @1503989421 +%Y%m%d%H%M%S # Convert the date (from timestamp)