Bash 4+ diuji -Ini adalah cara yang benar untuk mencari ukuran 0:
find /path/to/dir -size 0 -type f -name "*.xml"
Telusuri beberapa ekstensi file berukuran 0:
find /path/to/dir -size 0 -type f \( -iname \*.css -o -iname \*.js \)
Catatan:Jika Anda menghapus \( ... \) hasilnya adalah semua file yang memenuhi persyaratan ini sehingga mengabaikan ukuran 0.
Sebagai tambahan dari jawaban di atas:
Jika Anda ingin menghapus file-file itu
find $dir -size 0 -type f -delete
Tidak, Anda tidak perlu repot grep.
find $dir -size 0 ! -name "*.xml"
Untuk mencetak nama semua file di dalam dan di bawah $dir berukuran 0:
find "$dir" -size 0
Perhatikan bahwa tidak semua implementasi find
akan menghasilkan output secara default, jadi Anda mungkin perlu melakukan:
find "$dir" -size 0 -print
Dua komentar pada pengulangan terakhir dalam pertanyaan:
Daripada mengulangi setiap kata lain dalam sebuah string dan melihat apakah nilai alternatifnya nol, Anda dapat menghilangkan sebagian masalah yang Anda alami dengan spasi putih dengan mengulangi baris. misalnya:
printf '1 f1\n0 f 2\n10 f3\n' | while read size path; do
test "$size" -eq 0 && echo "$path"; done
Perhatikan bahwa ini akan gagal dalam kasus Anda jika salah satu jalur keluaran ls berisi baris baru, dan ini memperkuat 2 poin:jangan parsing ls
, dan memiliki kebijakan penamaan yang waras yang tidak mengizinkan spasi kosong di jalur.
Kedua, untuk mengeluarkan data dari loop, tidak perlu menyimpan keluaran dalam variabel hanya ke echo
dia. Jika Anda membiarkan loop menulis hasilnya ke stdout, Anda melakukan hal yang sama tetapi menghindari menyimpannya.