ฉันมีไดเรกทอรีที่มีข้อมูลมากกว่า 400 GiB ฉันต้องการตรวจสอบว่าไฟล์ทั้งหมดสามารถอ่านได้โดยไม่มีข้อผิดพลาดดังนั้นวิธีที่ง่าย ๆ ที่ฉันคิดก็คือการนำtar
ไป/dev/null
ใช้ แต่ฉันกลับเห็นพฤติกรรมต่อไปนี้แทน:
$ time tar cf /dev/null .
real 0m4.387s
user 0m3.462s
sys 0m0.185s
$ time tar cf - . > /dev/null
real 0m3.130s
user 0m3.091s
sys 0m0.035s
$ time tar cf - . | cat > /dev/null
^C
real 10m32.985s
user 0m1.942s
sys 0m33.764s
คำสั่งที่สามด้านบนถูกบังคับให้หยุดโดยCtrl+ Cหลังจากรันมานานแล้ว ยิ่งไปกว่านั้นในขณะที่คำสั่งสองคำสั่งแรกที่ใช้งานได้ตัวบ่งชี้กิจกรรมของอุปกรณ์เก็บข้อมูลที่มี.
อยู่นั้นไม่ได้ทำงาน ด้วยคำสั่งที่สามตัวบ่งชี้จะสว่างขึ้นอย่างต่อเนื่องหมายถึงยุ่งมาก
ดังนั้นดูเหมือนว่าเมื่อtar
สามารถค้นพบว่าไฟล์ที่ส่งออกของมัน/dev/null
คือเมื่อ/dev/null
เปิดโดยตรงที่จะมีการจัดการไฟล์ที่tar
เขียนไปแล้วร่างกายของไฟล์จะปรากฏขึ้นข้าม (การเพิ่มv
ตัวเลือกในการtar
พิมพ์ไฟล์ทั้งหมดในไดเรกทอรีเป็นtar
'สีแดง)
ดังนั้นฉันสงสัยว่าทำไมจึงเป็นเช่นนี้? มันเป็นการเพิ่มประสิทธิภาพบางอย่าง? ถ้าใช่แล้วทำไมtar
ถึงต้องการเพิ่มประสิทธิภาพที่น่าสงสัยสำหรับกรณีพิเศษเช่นนั้น?
ฉันใช้ GNU tar 1.26 กับ glibc 2.27 บน Linux 4.14.105 amd64
pv
tar -cf - | pv >/dev/null
นั่นก้าวย่างปัญหาและให้ข้อมูลความคืบหน้าแก่คุณ ( pv
ตัวเลือกต่าง ๆ)
gtar -cf /dev/zero ...
เพื่อให้ได้สิ่งที่คุณชอบ
find . -type f -exec shasum -a256 -b '{}' +
ในฐานะที่เป็นทางเลือกที่พิจารณาสิ่งที่ต้องการ ไม่เพียง แต่จะจริงอ่านและการตรวจสอบข้อมูลทั้งหมด แต่ถ้าคุณเก็บเอาท์พุทที่คุณสามารถ re-run ในภายหลังเพื่อตรวจสอบว่าเนื้อหาของไฟล์ที่ไม่ได้เปลี่ยนแปลง