Ini satu-kapal adalah cara yang paling efisien untuk menemukan 100% file nul menggunakan GNU find
, xargs
dan grep
(dengan asumsi yang terakhir dibangun dengan dukungan PCRE):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -r0 grep -LP "[^\x00]" --
Keuntungan dari metode ini dibandingkan jawaban lain yang disediakan adalah:
- file non-jarang termasuk dalam pencarian.
- file yang tidak dapat dibaca tidak diteruskan ke grep, menghindari
Permission denied
peringatan.
grep
akan berhenti membaca data dari file setelah menemukan byte non-nul ( LC_ALL=C
digunakan untuk memastikan setiap byte diartikan sebagai karakter ).
- file kosong (nol byte) tidak termasuk dalam hasil.
- lebih sedikit
grep
proses secara efisien memeriksa banyak file.
- jalur yang berisi baris baru atau mulai dengan
-
ditangani dengan benar.
- bekerja pada sebagian besar sistem embedded yang tidak memiliki Python / Perl.
Melewati -Z
opsi ke grep
dan menggunakan xargs -r0 ...
memungkinkan tindakan lebih lanjut untuk dilakukan pada file nul 100% (misalnya: pembersihan):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -0 grep -ZLP "[^\x00]" -- |
xargs -r0 rm --
Saya juga merekomendasikan menggunakan find
opsi -P
untuk menghindari symlink berikut, dan -xdev
untuk menghindari melintasi sistem file (misalnya: mount jarak jauh, bagan perangkat, bind mounts, dll).
Untuk mengabaikan karakter garis akhir , varian berikut harus berfungsi (walaupun saya pikir ini bukan ide yang bagus):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -r0 grep -LP "[^\x00\r\n]" --
Menyatukan semuanya, termasuk menghapus file yang tidak diinginkan (100% nul / karakter baris baru) untuk mencegahnya dicadangkan:
find -P . -xdev -type f -size +0 -readable -print0 |
LC_ALL=C xargs -0 grep -ZLP "[^\x00\r\n]" -- |
xargs -0 rm --
Saya tidak menyarankan untuk memasukkan file kosong (nol byte), mereka sering ada untuk tujuan yang sangat spesifik .