Saya ingin memeriksa di linux bash apakah sebuah file dibuat lebih dari x waktu yang lalu.
katakanlah file tersebut bernama text.txt dan waktunya 2 jam.
if [ what? ]
then
echo "old enough"
fi
linux
bash
command-line
flybywire
sumber
sumber
find
mengembalikan bukan nol ketika tidak ada kecocokan yang ditemukan.text.txt
dianggap bukan direktori.[ "$(find path/to/file -mmin +120)" ] && echo "it is old"
Saya selalu suka menggunakan
date -r /the/file +%s
untuk menemukan usianya.Anda juga dapat melakukannya
touch --date '2015-10-10 9:55' /tmp/file
untuk mendapatkan waktu yang sangat terperinci pada tanggal / waktu yang berubah-ubah.sumber
let AGE=$(($(date +%s)-$(date -r /path/to/file +%s)))
[dengan asumsi yang dibuat dan tidak pernah diubah, atau "usia relatif terhadap mod"]function file-age { FILE_CREATED_TIME=`date -r "$1" +%s`; TIME_NOW=`date +%s`; echo "$[ ${TIME_NOW} - ${FILE_CREATED_TIME} ]"; }
$[ ]
, jika tidak usang , paling tidak tua dan kurang portabel , dan$(( ))
sebagai gantinya harus digunakan ; dan kutipan balik lebih rapuh daripada$( )
; dan juga tanda hubung di nama fungsi mungkin tidak sepenuhnya portabel. Namun, intinya bagus!Menggunakan
stat
untuk mengetahui tanggal modifikasi terakhir file,date
untuk mengetahui waktu saat ini dan penggunaan bashisme yang bebas, seseorang dapat melakukan pengujian yang Anda inginkan berdasarkan waktu modifikasi terakhir file 1 .Meskipun kodenya sedikit kurang dapat dibaca daripada
find
pendekatannya, saya pikir ini adalah pendekatan yang lebih baik daripada menjalankanfind
untuk melihat file yang sudah "ditemukan". Selain itu, manipulasi tanggal juga menyenangkan ;-)%Z
sebagai pengganti di%Y
bawah ini untuk mendapatkan "waktu perubahan" yang mungkin sesuai dengan keinginan Anda.[Memperbarui]
Untuk pengguna mac, gunakan
stat -f "%m" $somefile
sintaks khusus Linux di atas sebagai penggantisumber
stat
tidak builtin - sangat buruk dari saya, saya akan memperbaikinya.Waktu pembuatan tidak disimpan.
Apa yang disimpan adalah tiga cap waktu (umumnya, mereka dapat dimatikan pada sistem file tertentu atau dengan opsi sistem file tertentu):
a "Perubahan" ke file dihitung sebagai perubahan izin, ganti nama, dll. Sementara modifikasi hanya konten.
sumber
Meskipun ctime tidak secara teknis waktu penciptaan, namun seringkali demikian.
Karena ctime tidak terpengaruh oleh perubahan konten file, biasanya hanya diperbarui saat file dibuat. Dan ya - saya dapat mendengar Anda semua berteriak - itu juga diperbarui jika Anda mengubah izin akses atau kepemilikan ... tetapi umumnya itu adalah sesuatu yang dilakukan sekali, biasanya pada saat yang sama Anda meletakkan file di sana.
Secara pribadi saya selalu menggunakan mtime untuk segala hal, dan saya membayangkan itulah yang Anda inginkan. Tapi bagaimanapun ... berikut adalah pengulangan dari pesta "tidak menarik" Guss, dalam fungsi yang mudah digunakan.
sumber
local changed=$(perl -MFile::stat -e "print stat(\"${filename}\")->mtime")
superuser.com/questions/427551/…chmod
, diterapkan pada file tersebut, akan membatalkan ide itu. Tapi aku bisa hidup denganmu melakukan itu ;-)+%s
paruh keduaage() { echo $(( $(date +%s) - $(date -r "$1" +%s) )); }
(Terima kasih kepada @Grizly untuk koreksinya!)noatime
opsi (yang bagus untuk kinerja jadi Anda harus menggunakannya). Jadi gunakan saja,%X
bukan%Y
.Menemukan yang bagus tetapi saya pikir Anda dapat menggunakan cara lain, terutama jika Anda perlu sekarang berapa detik file yang lama
date -d "now - $( stat -c "%Y" $filename ) seconds" +%s
menggunakan tanggal GNU
sumber
Pertimbangkan hasil dari alat 'stat':
Anda dapat melihat di sini tiga tanggal untuk Mengakses / memodifikasi / mengubah. Tidak ada tanggal dibuat. Anda hanya dapat benar-benar yakin bila konten file telah diubah (kolom "ubah") atau inode-nya diubah (kolom "ubah").
Contoh saat kedua kolom diperbarui:
"Ubah" akan diperbarui jika seseorang menggabungkan informasi tambahan ke akhir file.
"Ubah" akan diperbarui jika seseorang mengubah izin melalui chmod.
sumber
saya menggunakan
sumber