Jak wyświetlić zmodyfikowany czas pliku?

35

Chciałbym znaleźć i wydrukować zmodyfikowany czas pliku do użycia w skrypcie bash.

Wymyśliłem:

ls -l $filename | cut -d ' ' -f '6-8'

Które wyjścia:

Jul 26 15:05

Chociaż chciałbym uniknąć parsowania ls, dobrze byłoby też mieć rok.

Idealnie chciałbym zobaczyć wyjście podobne do domyślnego wyjścia datepolecenia.

Tue Jul 26 15:20:59 BST 2016

Jakie inne przydatne metody są dostępne?

Arroniczny
źródło

Odpowiedzi:

46

Nie używaj ls, jest to praca dla stat:

stat -c '%y' filename

-cpozwala nam uzyskać określone dane wyjściowe, tutaj %yotrzymamy czas ostatniej modyfikacji pliku w formacie czytelnym dla człowieka. Aby uzyskać czas w sekundach od użycia Epoki %Y:

stat -c '%Y' filename

Jeśli chcesz również nazwę pliku, użyj %n:

stat -c '%y : %n' filename
stat -c '%Y : %n' filename

Ustaw specyfikatory formatu w zależności od potrzeb. Sprawdzić man stat.

Przykład:

% stat -c '%y' foobar.txt
2016-07-26 12:15:16.897284828 +0600

% stat -c '%Y' foobar.txt
1469513716

% stat -c '%y : %n' foobar.txt
2016-07-26 12:15:16.897284828 +0600 : foobar.txt    

% stat -c '%Y : %n' foobar.txt
1469513716 : foobar.txt

Jeśli chcesz uzyskać wynik Tue Jul 26 15:20:59 BST 2016, użyj czasu Epoki jako danych wejściowych, aby date:

% date -d "@$(stat -c '%Y' a.out)" '+%a %b %d %T %Z %Y'
Tue Jul 26 12:15:21 BDT 2016

% date -d "@$(stat -c '%Y' a.out)" '+%c'               
Tue 26 Jul 2016 12:15:21 PM BDT

% date -d "@$(stat -c '%Y' a.out)"
Tue Jul 26 12:15:21 BDT 2016

Sprawdź datespecyfikatory formatu, aby spełnić Twoje potrzeby. Zobacz man dateteż.

heemayl
źródło
5
W odpowiedzi na tę odpowiedź należy pamiętać, że lsjest ona niekonsekwentnie wdrażana w różnych systemach i dlatego nigdy nie powinna być wykorzystywana do jakiejkolwiek automatyzacji. Zamiast tego używaj poleceń takich jak stati findpodczas pisania skryptów.
Paddy Landau
1
doskonały. Nie wiedziałem o tym małym skarbie. Tak wielu z nich w środowisku * nix / linux jeszcze nie zostało odkrytych.
Ken Ingram
1

próbowałem

ls -l $filename | cut -d ' ' -f '6-8'

ale jeśli data jest krótsza niż 10, traci czas. Jest to spowodowane dodatkowym miejscem przed datą, jeśli jest mniejsza niż 10. Spróbuj tego:

filename="test.txt"
ls -l $filename | awk -F ' ' '{print $6" "$7" "$8}'

Polecenie awk drukuje pola oddzielone wszystkimi spacjami (-F ''). Mam nadzieję, że to działa. Wiem, że to nie odpowiada na pierwotne pytanie, a jedynie wyjaśnienie polecenia ls dla tylko daty i godziny. Kiedy Google „ubuntu dostaje datę i godzinę pliku”, wypisuje to pytanie u góry, to jest to, czego szukałem, ponieważ nie potrzebuję również roku. W przypadku roku, daty i godziny możesz wypróbować jedno z poniższych poleceń. % m drukuje numer miesiąca. % b drukuje skrót miesiąca: upuść% H:% M, jeśli nie potrzebujesz godziny i minuty. % -d nie drukuje zera wiodącego dla dnia miesiąca.

date -r $filename +"%Y %m %-d %H:%M"
date -r $filename +"%y %m %-d %H:%M"
date -r $filename +"%Y %b %-d %H:%M"
date -r $filename +"%y %b %-d %H:%M"
te7
źródło