Bir dosyanın değiştirilip değiştirilmediğini belirleme


10

Linux bir dosyanın içeriğini değiştirilip değiştirilmediğini nasıl bir hızla kontrol edebilirsiniz, (şu anda ext4 dosya sistemini kullanarak) olarak olmaksızın içeriğinin herhangi okuma?

statkomut önerilen bir yaklaşım? Şu anda yapıyorum

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

ve sonra aynı komutun aynı çıktıyı verip vermediğini kontrol edebilirim. Varsa, hello.txt dosyasının değişmediği sonucuna varıyorum.

Benim hissim, kişinin daha da emin olmak için daha fazla parametre atmak istemesi. Örneğin, dosya boyutunu, dosya adını vb. Eklemek dosyanın daha iyi bir "parmak izini" sağlar mı?

Bu konuda, bir zamanlar sahip olduğum bir TrueCrypt biriminin artımlı yedekleme programım tarafından her zaman göz ardı edildiğini hatırlıyorum, çünkü TrueCrypt geride hiçbir meta veri değişikliği bırakmadığından emin oldu. Döndürülen tüm verileri değiştirmenin gerçekten mümkün olduğunu düşünüyorum stat, bu nedenle dosyanın her olası değişikliğini almak garanti edilemez mi?


md5sum filename?
Ramesh

md5sumveya herhangi bir sağlama toplamı dosyanın içeriğini okur. Bunu yapmak istemiyorum çünkü amacım için çok yavaş.
DustByte

ls -tbir dizindeki içeriği değiştirme zamanına göre sıralar.
ryekayo

"değiştirildi"? Her dosya değiştirildi, soru ne zaman değiştirildi. Belirli bir modifikasyon zaman aralığını aramak için 'find'ı kullanabilirsiniz.
Ray Andrews

Yanıtlar:


5

Bir dosyanın normal yollarla değiştirilip değiştirilmediğini tespit etmek istiyorsanız (bazı uygulamalarda düzenleme, revizyon kontrol sistemlerinden yeni bir sürümü kontrol etme, yeniden oluşturma vb.), Değiştirme süresinin (mtime) değişip değişmediğini kontrol edin. son kontrol. İşte en neyi stat -c %Yraporlar.

Değiştirme zamanı touchkomut ile ayarlanabilir . Dosyanın herhangi bir şekilde değişip değişmediğini (kullanımı, toucharşiv çıkarma vb. Dahil) tespit etmek istiyorsanız , inode değiştirme süresinin ( ctime ) son kontrolden değişip değişmediğini kontrol edin. İşte en neyi stat -c %Zraporlar. Ctime, sistem yöneticisi dışında (ve o zaman bile, sadece dolaylı yollarla: sistem saatini değiştirerek veya diske doğrudan erişerek, dosya sistemini atlayarak) taklit edilemez.


Teşekkürler, kullanmam gereken ctime olduğunu düşünüyorum. Benim sorumdan, bunun amacının, checksum'ların yalnızca yeni dosyalar veya değişen dosyalar için hesaplanacağı kendi yedekleme komut dosyamda kullanmak olduğunu takip etmedim. Ben sadece "biraz" değişti dosyaları için kontrol sağlama göze alabilir, izinleri değişti, vb. Ben aslında bir değişiklik belirlemek için dosyanın içeriğine bakmak mümkün olduğunca yakın olmayı tercih ederim.
DustByte

3

Stat komutu yalnızca bir saniyelik bir çözünürlüğe sahiptir. Dosya aynı saniyede iki kez değiştirilirse, bir değişikliği kaçırabilirsiniz. Ext4 gibi daha yeni dosya sistemleri nanosaniyede daha yüksek çözünürlük zaman damgaları sağlar, ancak bazı eski araçlar henüz yakalanmamıştır.

Ayrıca, diğer programların isteğe bağlı bir değişiklik zamanı ayarlaması da mümkündür. Bunun nasıl yapılacağını touch komutuyla görebilirsiniz.

Bu iki olasılıktan herhangi birinden endişe ediyorsanız, dosya boyutuna da bakmak kötü bir fikir olmaz. Değiştirilmiş dosyaları ararken rsync bunu yapar.


1

Benim hissim, kişinin daha da emin olmak için daha fazla parametre atmak istemesi.

Sahip olduğunuz doğru yöntemdir. Bunun başarısız olmasının tek nedeni, dosya sisteminin düzgün bir şekilde güncellenmemesi olabilir - bu durumda bir sürü daha ciddi sorunla karşılaşırsınız.

Tabii ki, bölümün erişilebilir olduğu bir sisteme doğru bilgiye ve kök erişimine sahip birisinin , dosyayı değiştirilmemiş gibi görünmesi için bilgileri değiştirebileceğini düşünüyorum. Bununla birlikte, bu durumda mutlaka aynı boyutta vb.


0

Parmak izini daha ayrıntılı hale getiriyorum.

MacOS / BSD ve GNU sürümleri için aynı çıktıyı üreten küçük bir sarma işlevi yaptım stat(ayrıca Homebrew tarafından yüklenen sürümü bir gönekle algılar ).

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";
}

initFonksiyon komut başlatma sırasında bir kez çağrılır ve getFileStatusalgılama yükü olmadan sürekli olarak adlandırılabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.