Cetak tanggal modifikasi terakhir file di Bash

147

Sepertinya saya tidak bisa menemukan cara untuk mencetak tanggal file. Sejauh ini saya dapat mencetak semua file dalam suatu direktori, tetapi saya perlu mencetak tanggalnya.

Saya tahu saya harus melampirkan format tanggal dengan gema entri, tetapi semua saya tidak dapat menemukan format yang benar.

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

read directory 

for entry in "$directory"/*
do
  echo "$entry"
done
Hokerie
sumber
2
baca -p "Silakan ketik direktori yang Anda inginkan semua direktori terdaftar" direktori
CousinCocaine

Jawaban:

146

Anda bisa menggunakan stat perintah

stat -c %y "$entry"

Info lebih lanjut

% y waktu modifikasi terakhir, dapat dibaca manusia
Steven Penny
sumber
for entry in "$directory"/* do stat -c%y "$entry" done Tidak bekerja Mencetak stat: operan yang hilang di terminal
Hokerie
Hm, mungkinkah itu unbuntu saya? Apakah Anda tahu apa persyaratan penggunaannya stat?
Hokerie
33
Perhatikan bahwa pada OS X (Mac), ini stat -f "%m%t%Sm %N" filename(lihat man stat contoh untuk lebih jelasnya)
Olie
3
Perhatikan bahwa pada BSD statperintah memiliki sintaks yang berbeda. Kasus saya untuk FreeBSD: stat -f %Sm -t %F" "%R filename.
Sopalajo de Arrierez
229

Bukankah perintah 'kencan' lebih sederhana? Tidak perlu awk, stat, dll.

date -r <filename>

Juga, pertimbangkan untuk melihat halaman manual untuk format tanggal; misalnya dengan format tanggal dan waktu yang sama:

date -r <filename> "+%m-%d-%Y %H:%M:%S"
mmond
sumber
11
Jauh lebih sederhana daripada menggunakan stat / lebih banyak tersedia.
Ing
11
Sepertinya BSD (atau setidaknya OS X) datetidak memiliki ini. Ini -rhanya digunakan untuk memberikan cap waktu untuk memformat. Anda harus menggunakan tanggal GNU untuk mendapatkan fungsi ini.
Waleed Khan
4
Pada OSX gunakan: tanggalstat -f "%Sm" -t "%m%d%H%M%y" "${1}"
Michaelangel007
3
Pada OS X 10.10 date -r <filename> berfungsi seperti yang diiklankan, meskipun halaman manual tidak menjelaskan argumen <filename> apa pun.
Gotofritz
3
Dalam macOS 10.13 date [-r seconds | filename]sepenuhnya didokumentasikan dalam manhalaman, dan berfungsi seperti yang diharapkan.
Eselon
14

Pada OS X, saya ingin teman kencan saya berada dalam format YYYY-MM-DD HH:MMdalam output untuk file.

Jadi untuk menentukan file yang akan saya gunakan:

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

Jika saya ingin menjalankannya pada berbagai file, saya dapat melakukan sesuatu seperti ini:

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

Contoh ini akan mencetak terakhir kali saya menjalankan sudo periodic daily weekly monthlyperintah karena referensi file log.


Untuk menambahkan nama file di bawah setiap tanggal, saya akan menjalankan yang berikut:

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

Outputnya adalah sebagai berikut:

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

Sayangnya saya tidak yakin bagaimana mencegah jeda baris dan menjaga nama file ditambahkan pada akhir tanggal tanpa menambahkan lebih banyak baris ke skrip.


PS - Saya gunakan #!/usr/bin/env bashkarena saya adalah pengguna Python pada siang hari, dan memiliki berbagai versi yang bashdiinstal pada sistem saya, bukan#!/bin/bash

Danijel-James W
sumber
Jika Anda belum menemukan bagian pemecah baris, flag -e tersedia untuk program echo. Contoh penggunaan bisa menjadi: echo -e "$(stat -f %Sm -t %Y%m%d_%H%M%S $AFile)\t$AFile.". Dalam kasus Anda itu bisa jadi: echo -e "$(stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i")\t$i." `
Thoth
14

Yang terbaik

date -r filename +"%Y-%m-%d %H:%M:%S"
Rishi
sumber
Jawaban ini adalah duplikat dari stackoverflow.com/a/20807343/6320039
Ulysse BN
@ UssseBN tidak sedikit berbeda. Dia menganjurkan format tanggal yang lebih baik.
iconoclast
6

Menambahkan ke jawaban @StevePenny, Anda mungkin ingin memotong bagian yang tidak bisa dibaca manusia:

stat -c%y Localizable.strings | cut -d'.' -f1
fotanus
sumber
3

Saya ingin mendapatkan tanggal modifikasi file dalam YYYYMMDDHHMMSSformat. Inilah cara saya melakukannya:

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

Penjelasan. Ini kombinasi dari perintah-perintah ini:

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)
Fabien Snauwaert
sumber
2

DIedit: ternyata saya lupa tanda kutip yang diperlukan untuk $entrymencetak dengan benar dan tidak memberikan kesalahan "tidak ada file atau direktori". Terima kasih banyak telah membantu saya!

Ini kode terakhir saya:

    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

Cetakan seperti ini:

/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
Hokerie
sumber
2

Untuk jeda baris saya mengedit kode Anda untuk mendapatkan sesuatu tanpa jeda baris.

#!/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
Anton Kiggundu
sumber
1

Jika nama file tidak memiliki spasi:

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

Ini mencetak sebagai format berikut:

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

Jika nama file memiliki spasi (Anda dapat menggunakan perintah berikut untuk nama file tanpa spasi juga, hanya saja terlihat rumit / jelek dari yang sebelumnya):

 ls -l <dir> | awk '{printf ("%s %s %s ",  $6,  $7, $8); for (i=9;   i<=NF; i++){ printf ("%s ", $i)}; printf ("\n")}'
Tagihan
sumber
Ah, begitu! Itu sebagian besar berhasil, kecuali untuk file dengan spasi di namanya. Apakah ada solusi untuk itu?
Hokerie
Sebenarnya, saya mencobanya lagi, dan tidak berhasil ... ternyata saya mencoba direktori yang memiliki nama file tanpa spasi. = / Diedit jawaban saya di bawah ini
Hokerie
ketika Anda mengatakan itu tidak berhasil, dapatkah Anda mengatakan apa kesalahannya? ini bekerja untuk saya ketika saya menjalankannya di sistem saya.
Bill
Saya mendapat "tidak ada file atau direktori".
Hokerie
Itu karena Anda melewati nilai <dir>yang tidak ada .... kodenya baik-baik saja.
Bill
0

Kamu bisa memakai:

ls -lrt filename |awk '{print "%02d",$7}'

Ini akan menampilkan tanggal dalam 2 digit.

Jika antara 1 hingga 9 itu menambahkan "0" awalan untuk itu dan mengkonversi ke 01 - 09.

Semoga ini memenuhi harapan.

Yoga Nathan
sumber