Untuk tujuan debugging, saya perlu mencari direktori secara rekursif untuk semua file yang dimulai dengan UTF-8 byte order mark (BOM). Solusi saya saat ini adalah skrip shell sederhana:
find -type f |
while read file
do
if [ "`head -c 3 -- "$file"`" == $'\xef\xbb\xbf' ]
then
echo "found BOM in: $file"
fi
done
Atau, jika Anda lebih suka baris satu yang pendek dan tidak terbaca:
find -type f|while read file;do [ "`head -c3 -- "$file"`" == $'\xef\xbb\xbf' ] && echo "found BOM in: $file";done
Ini tidak berfungsi dengan nama file yang berisi jeda baris, tetapi file seperti itu tidak diharapkan.
Apakah ada solusi yang lebih singkat atau lebih elegan?
Apakah ada editor teks atau makro yang menarik untuk editor teks?
sumber
grep -rlI $'\xEF\xBB\xBF' .
untuk mengabaikan file biner.Cara terbaik dan termudah untuk melakukannya di Windows:
Total Commander → buka direktori root proyek → temukan file ( Alt+ F7) → jenis file *. * → Temukan teks "EF BB BF" → centang 'Hex' checkbox → cari
Dan Anda mendapatkan daftarnya :)
sumber
Sebagian besar solusi yang diberikan di atas menguji lebih dari baris pertama file, bahkan jika beberapa (seperti solusi Marcus) kemudian memfilter hasilnya. Solusi ini hanya menguji baris pertama dari setiap file sehingga seharusnya lebih cepat.
sumber
find . -type f -print0 | xargs -0 awk '/^\xEF\xBB\xBF/ {print FILENAME} {nextfile}'
Jika Anda menerima beberapa positif palsu (jika ada file non-teks, atau dalam kasus yang tidak biasa ada ZWNBSP di tengah file), Anda dapat menggunakan grep:
sumber
Saya akan menggunakan sesuatu seperti:
Yang akan memastikan bahwa BOM terjadi mulai dari byte pertama file.
sumber
Anda dapat menggunakan
grep
untuk menemukannya dan Perl untuk menghapusnya seperti ini:sumber
Untuk pengguna Windows, lihat ini (skrip PHP yang baik untuk menemukan
BOM
dalam proyek Anda).sumber
Solusi berlebihan untuk ini adalah
phptags
(bukanvi
alat dengan nama yang sama), yang secara khusus mencari skrip PHP:Akan menghasilkan sesuatu seperti:
Dan
--whitespace
mode tersebut akan secara otomatis memperbaiki masalah tersebut (secara rekursif, tetapi menegaskan bahwa itu hanya menulis ulang skrip .php.)sumber
find -print0
menempatkan null \ 0 di antara setiap nama file daripada menggunakan baris baruxargs -0
mengharapkan argumen yang dipisahkan nol, bukan dipisahkan barisgrep -l
mencantumkan file yang cocok dengan ekspresi reguler^\xeff\xbb\xbf
tidak sepenuhnya benar, karena akan cocok dengan file UTF-8 non-BOM jika memiliki spasi lebar nol di awal barissumber
Saya menggunakan ini untuk memperbaiki hanya file JavaScript:
sumber
Jika Anda mencari file UTF, perintah file berfungsi. Ini akan memberi tahu Anda apa pengkodean file itu. Jika ada karakter non ASCII di sana, itu akan muncul dengan UTF.
Itu tidak akan bekerja secara rekursif. Anda mungkin dapat memasang beberapa perintah mewah untuk membuatnya rekursif, tetapi saya hanya mencari setiap level secara individual seperti berikut, sampai saya kehabisan level.
sumber