นี้หนึ่งซับเป็นวิธีที่มีประสิทธิภาพมากที่สุดในการค้นหาไฟล์ NUL 100% โดยใช้ GNU find
, xargs
และgrep
(สมมติว่าหลังถูกสร้างขึ้นด้วยการสนับสนุน PCRE):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -r0 grep -LP "[^\x00]" --
ข้อดีของวิธีนี้เหนือคำตอบอื่น ๆ ที่ให้ไว้คือ:
- ไฟล์ที่ไม่กระจายอยู่ในการค้นหา
- ไฟล์ที่อ่านไม่ได้จะไม่ถูกส่งไปยัง grep หลีกเลี่ยงการ
Permission denied
เตือน
grep
จะหยุดอ่านข้อมูลจากไฟล์หลังจากค้นหาไบต์ที่ไม่ใช่ nul ใด ๆ ( LC_ALL=C
ใช้เพื่อให้แน่ใจว่าแต่ละไบต์ถูกตีความว่าเป็นอักขระ )
- ไฟล์ที่ว่างเปล่า (ศูนย์ไบต์) จะไม่รวมอยู่ในผลลัพธ์
- น้อยลง
grep
กระบวนการตรวจสอบหลายไฟล์อย่างมีประสิทธิภาพ
- เส้นทางที่มีการขึ้นบรรทัดใหม่หรือเริ่มต้นด้วย
-
การจัดการอย่างถูกต้อง
- ทำงานบนระบบฝังตัวส่วนใหญ่ที่ไม่มี Python / Perl
การส่งผ่าน-Z
ตัวเลือกไปยังgrep
และการใช้งานxargs -r0 ...
จะช่วยให้สามารถดำเนินการเพิ่มเติมกับไฟล์ nul 100% (เช่น: ล้างข้อมูล):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -0 grep -ZLP "[^\x00]" -- |
xargs -r0 rm --
ฉันขอแนะนำให้ใช้find
ตัวเลือกต่าง ๆ-P
เพื่อหลีกเลี่ยงการเชื่อมโยงไปถึงและ-xdev
เพื่อหลีกเลี่ยงการข้ามระบบไฟล์ (เช่น: การเมาท์ระยะไกล, โครงสร้างอุปกรณ์, การเชื่อมต่อเมา ฯลฯ )
สำหรับการเพิกเฉยอักขระบรรทัดปลายตัวแปรต่อไปนี้ควรใช้งานได้ (แม้ว่าฉันไม่คิดว่านี่เป็นความคิดที่ดี):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -r0 grep -LP "[^\x00\r\n]" --
รวมทั้งหมดเข้าด้วยกันรวมถึงการลบไฟล์ที่ไม่ต้องการ (100% nul / อักขระขึ้นบรรทัดใหม่) เพื่อป้องกันไม่ให้ทำการสำรองข้อมูล:
find -P . -xdev -type f -size +0 -readable -print0 |
LC_ALL=C xargs -0 grep -ZLP "[^\x00\r\n]" -- |
xargs -0 rm --
ผมไม่แนะนำให้รวมถึงไฟล์ที่ว่างเปล่า (ศูนย์ bytes) พวกเขามักจะมีอยู่สำหรับมาก เฉพาะ วัตถุประสงค์