ตรวจสอบว่าไฟล์ถูกแก้ไขหรือไม่


10

ใน Linux (ปัจจุบันใช้ระบบไฟล์ ext4) จะสามารถตรวจสอบได้อย่างรวดเร็วว่าเนื้อหาของไฟล์ถูกแก้ไขโดยไม่อ่านเนื้อหาใด ๆ ของมันอย่างไร

เป็นstatคำสั่งวิธีการที่แนะนำ? ฉันกำลังทำ

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

และต่อมาฉันสามารถตรวจสอบว่าคำสั่งเดียวกันให้ผลลัพธ์เดียวกันหรือไม่ หากเป็นเช่นนั้นฉันสรุปได้ว่า hello.txt ไม่ได้เปลี่ยนไป

ความรู้สึกของฉันคือคนต้องการที่จะโยนพารามิเตอร์เพิ่มเติมเพื่อให้แน่ใจยิ่งขึ้น ตัวอย่างเช่นจะเพิ่มขนาดไฟล์ชื่อไฟล์ ฯลฯ ให้ "ลายนิ้วมือ" ของไฟล์ที่ดียิ่งขึ้นหรือไม่

ในหัวข้อนี้ฉันจำได้ว่าไดรฟ์ข้อมูล TrueCrypt ที่ฉันเคยได้รับมักจะถูกละเว้นโดยโปรแกรมสำรองข้อมูลส่วนเพิ่มของฉันอาจเป็นเพราะ TrueCrypt ทำให้แน่ใจว่าไม่มีการเปลี่ยนแปลงข้อมูลเมตา ฉันคิดว่ามันเป็นไปได้จริง ๆ ที่จะเปลี่ยนแปลงข้อมูลทั้งหมดที่ส่งคืนโดยstatดังนั้นจึงไม่สามารถรับประกันได้ว่าจะรับทุกการเปลี่ยนแปลงที่เป็นไปได้ของไฟล์หรือไม่


md5sum filename?
Ramesh

md5sumหรือ checksum ประเภทใด ๆ จะอ่านเนื้อหาของไฟล์ ฉันไม่ต้องการที่จะทำอย่างนั้นเพราะมันช้าเกินไปสำหรับวัตถุประสงค์ของฉัน
DustByte

ls -tจะเรียงลำดับเนื้อหาในไดเรกทอรีตามเวลาที่แก้ไข
ryekayo

"ได้รับการแก้ไข" หรือไม่ ทุกไฟล์ได้รับการแก้ไขคำถามคือเมื่อมันถูกแก้ไข คุณสามารถใช้ 'ค้นหา' เพื่อค้นหาช่วงเวลาการปรับเปลี่ยนที่เฉพาะเจาะจง
Ray Andrews

คำตอบ:


5

หากคุณต้องการตรวจสอบว่ามีการแก้ไขไฟล์ด้วยวิธีปกติหรือไม่ (แก้ไขในบางแอปพลิเคชันตรวจสอบเวอร์ชันใหม่จากระบบควบคุมการแก้ไขการสร้างใหม่อีกครั้ง) ให้ตรวจสอบว่าเวลาการแก้ไข (mtime) เปลี่ยนจาก ตรวจสอบล่าสุด นั่นคือสิ่งที่stat -c %Yรายงาน

เวลาการแก้ไขสามารถตั้งค่าได้โดยtouchคำสั่ง หากคุณต้องการตรวจสอบว่าไฟล์มีการเปลี่ยนแปลงในทางใดทางหนึ่ง (รวมถึงการใช้touchการแตกไฟล์เก็บถาวรเป็นต้น) ให้ตรวจสอบว่าเวลาในการเปลี่ยน inode ( ctime ) เปลี่ยนแปลงจากการตรวจสอบครั้งล่าสุดหรือไม่ นั่นคือสิ่งที่stat -c %Zรายงาน ctime ไม่สามารถปลอมแปลงได้ยกเว้นโดยผู้ดูแลระบบ (และแม้กระทั่งจากนั้นด้วยวิธีการทางอ้อมเท่านั้น: โดยการเปลี่ยนนาฬิการะบบหรือโดยการเข้าถึงดิสก์โดยตรงโดยอ้อมผ่านระบบไฟล์)


ขอบคุณฉันรวบรวม ctime นั่นคือสิ่งที่ฉันควรใช้ ฉันไม่ได้ทำตามคำถามของฉันว่าจุดประสงค์นี้คือเพื่อใช้ในสคริปต์สำรองของฉันโดยที่ checksums จะถูกคำนวณเฉพาะสำหรับไฟล์ใหม่หรือไฟล์ที่มีการเปลี่ยนแปลง ฉันสามารถคำนวณ checksums สำหรับไฟล์ที่มีการเปลี่ยนแปลงเพียง "เล็กน้อย" กล่าวว่าการอนุญาตมีการเปลี่ยนแปลง ฯลฯ ฉันชอบที่จะเข้าใกล้ที่สุดเท่าที่จะทำได้เพื่อดูเนื้อหาของไฟล์เพื่อพิจารณาการเปลี่ยนแปลง
DustByte

3

คำสั่ง stat มีความละเอียดเพียงเสี้ยววินาที ดังนั้นหากไฟล์ถูกแก้ไขสองครั้งในวินาทีเดียวกันคุณอาจพลาดการแก้ไข ระบบไฟล์ที่ใหม่กว่าเช่น ext4 จะให้ความละเอียดการประทับเวลาที่สูงขึ้นในหน่วยนาโนวินาที แต่เครื่องมือเก่าบางตัวยังไม่ทันตั้งตัว

นอกจากนี้ยังเป็นไปได้ที่โปรแกรมอื่นจะตั้งเวลาแก้ไขโดยพลการ คุณสามารถดูว่าสิ่งนี้เกิดขึ้นได้อย่างไรผ่านคำสั่งสัมผัส

หากคุณกังวลเกี่ยวกับความเป็นไปได้ทั้งสองอย่างนั้นก็ไม่ควรที่จะดูขนาดไฟล์ด้วย นี่คือสิ่งที่ rsync ทำเมื่อมันค้นหาไฟล์ที่ถูกดัดแปลง


1

ความรู้สึกของฉันคือคนต้องการที่จะโยนพารามิเตอร์เพิ่มเติมเพื่อให้แน่ใจยิ่งขึ้น

สิ่งที่คุณมีคือวิธีที่ถูกต้อง เหตุผลเดียวที่ทำให้ระบบล้มเหลวก็คือหากระบบไฟล์ไม่ได้รับการอัปเดตอย่างถูกต้องซึ่งในกรณีนี้คุณจะพบกับปัญหาร้ายแรงทั้งหมด

แน่นอนฉันคิดว่าใครบางคนที่มีความรู้ที่ถูกต้องและการเข้าถึงรูทไปยังระบบที่พาร์ติชันสามารถเข้าถึงได้อาจสามารถแก้ไขข้อมูลเพื่อให้ดูเหมือนว่าไฟล์นั้นไม่ได้ถูกเปลี่ยนแปลง อย่างไรก็ตามในกรณีนี้พวกเขาจะทำให้แน่ใจว่าจะทำเช่นเดียวกันกับขนาด ฯลฯ


0

ฉันทำลายนิ้วมือที่มีรายละเอียดมากขึ้น

ฉันสร้างฟังก์ชั่น wrapper เล็ก ๆ ที่สร้างผลลัพธ์ที่เหมือนกันสำหรับทั้งรุ่น MacOS / BSD และ GNU stat(ตรวจจับเวอร์ชัน Homebrew ที่ติดตั้งพร้อมgคำนำหน้า)

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

initฟังก์ชั่นได้รับการเรียกครั้งเดียวในระหว่างการเตรียมสคริปต์และgetFileStatusสามารถเรียกซ้ำ ๆ โดยไม่ต้องตรวจสอบค่าใช้จ่าย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.