Tentukan apakah file telah dimodifikasi

10

Di Linux (saat ini menggunakan sistem file ext4), bagaimana orang dapat memeriksa dengan cepat jika konten file telah dimodifikasi tanpa membaca kontennya?

Apakah statperintah itu pendekatan yang disarankan? Saat ini saya lakukan

$ stat --format "%Y" hello.txt

dan kemudian saya dapat memeriksa apakah perintah yang sama menghasilkan keluaran yang sama. Jika ya, saya menyimpulkan bahwa hello.txt belum berubah.

Perasaan saya adalah seseorang ingin memasukkan lebih banyak parameter untuk lebih yakin. Misalnya, apakah menambahkan ukuran file, nama file, dll, akan memberikan "sidik jari" file yang lebih baik?

Pada topik ini, saya ingat bahwa volume TrueCrypt yang pernah saya miliki selalu diabaikan oleh program cadangan tambahan saya, mungkin karena TrueCrypt memastikan untuk tidak meninggalkan perubahan meta data di belakang. Saya kira memang mungkin untuk mengubah semua data yang dikembalikan oleh stat, oleh karena itu tidak dapat dijamin untuk mengambil setiap kemungkinan modifikasi file?

DustByte
sumber
md5sum filename?
Ramesh
md5sumatau segala macam checksum membaca isi file. Saya tidak ingin melakukan itu karena terlalu lambat untuk tujuan saya.
DustByte
ls -takan mengurutkan konten dalam direktori berdasarkan waktu modifikasi.
ryekayo
"telah dirubah"? Setiap file telah dimodifikasi, pertanyaannya adalah kapan itu diubah. Anda dapat menggunakan 'temukan' untuk mencari rentang waktu modifikasi tertentu.
Ray Andrews

Jawaban:

5

Jika Anda ingin mendeteksi apakah file telah dimodifikasi melalui cara normal (mengeditnya di beberapa aplikasi, memeriksa versi baru dari sistem kontrol revisi, membangunnya kembali, dll.), Periksa apakah waktu modifikasi (mtime) telah berubah dari cek terakhir. Itulah yang stat -c %Ydilaporkan.

Waktu modifikasi dapat diatur oleh touchperintah. Jika Anda ingin mendeteksi apakah file tersebut telah diubah dengan cara apapun (termasuk penggunaan touch, penggalian arsip, dll), periksa apakah waktu perubahan inode nya ( kriminal ) telah berubah dari cek terakhir. Itulah yang stat -c %Zdilaporkan. Waktu tidak dapat dipalsukan kecuali oleh administrator sistem (dan bahkan kemudian, hanya melalui cara tidak langsung: dengan mengubah jam sistem, atau dengan mengakses disk secara langsung, mem-bypass sistem file).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih, saya mengumpulkan bahwa waktu adalah apa yang harus saya gunakan. Itu tidak mengikuti dari pertanyaan saya bahwa tujuan ini adalah untuk menggunakannya dalam skrip cadangan saya sendiri, di mana checksum akan dihitung hanya untuk file baru atau file yang telah berubah. Saya mampu menghitung checksum untuk file yang telah berubah hanya "sedikit", katakanlah izin telah berubah, dll. Saya lebih suka sedekat mungkin untuk benar-benar melihat isi file untuk menentukan perubahan.
DustByte
3

Perintah stat hanya memiliki resolusi satu detik. Jadi, jika file itu diubah dua kali dalam detik yang sama Anda bisa melewatkan modifikasi. Sistem file yang lebih baru seperti ext4 memberikan cap waktu resolusi lebih tinggi dalam nanodetik, tetapi beberapa alat lama belum menyusul.

Juga, mungkin bagi program lain untuk mengatur waktu modifikasi yang sewenang-wenang. Anda dapat melihat bagaimana ini bisa terjadi melalui perintah sentuh.

Jika Anda mengkhawatirkan salah satu dari dua kemungkinan itu, bukan ide yang buruk untuk melihat ukuran file juga. Inilah yang dilakukan rsync ketika mencari file yang dimodifikasi.

Steve Sether
sumber
1

Perasaan saya adalah seseorang ingin memasukkan lebih banyak parameter untuk lebih yakin.

Apa yang Anda miliki adalah metode yang benar. Satu-satunya alasan untuk gagal adalah jika sistem file tidak memperbarui dengan benar - dalam hal ini Anda akan berakhir dengan sejumlah masalah yang lebih serius.

Tentu saja, saya kira seseorang dengan pengetahuan yang benar dan akses root ke sistem di mana partisi dapat diakses mungkin dapat mengubah informasi agar terlihat seolah-olah file belum diubah. Namun, dalam hal ini mereka pasti akan memastikan untuk melakukan hal yang sama dengan ukurannya, dll.

goldilocks
sumber
0

Saya membuat sidik jari lebih detail.

Saya membuat fungsi pembungkus kecil yang menghasilkan keluaran yang identik untuk versi MacOS / BSD dan GNU stat(juga mendeteksi versi yang diinstal oleh Homebrew dengan gawalan).

init() {
  if command -v gstat > /dev/null; then
    # GNU coreutils with g prefix.
    statCmdArgs=("gstat" "--format=%n %s %b %u %g %i %h %Y %Z %W %o");
  elif ! stat --version > /dev/null 2> /dev/null; then
    # MacOS/BSD stat
    statCmdArgs=("stat" "-f" "%N %z %b %u %g %i %l %m %c %B %k");
  else
    # Assume GNU version without prefix.
    statCmdArgs=("stat" "--format=%n %s %b %u %g %i %h %Y %Z %W %o");
  fi;
}

getFileStatus() {
  "${statCmdArgs[@]}" "$1";
}

The initfungsi dipanggil sekali selama inisialisasi naskah dan getFileStatusdapat disebut berulang kali tanpa overhead deteksi.

menghancurkan
sumber