นี้หนึ่งซับเป็นวิธีที่มีประสิทธิภาพมากที่สุดในการค้นหาไฟล์ 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) พวกเขามักจะมีอยู่สำหรับมาก เฉพาะ วัตถุประสงค์