BOM ile UTF-8 dosyaları aramak için zarif bir yolu?

9 Cevap php

Hata ayıklama amaçları için, ben ardışık bir UTF-8 bayt sırası işareti (BOM) ile başlayan tüm dosyaları için bir dizin aramak gerekir. Benim geçerli çözüm basit bir kabuk yazısıdır:

find -type f |
while read file
do
    if [ "`head -c 3 -- "$file"`" == $'\xef\xbb\xbf' ]
    then
        echo "found BOM in: $file"
    fi
done

Veya, kısa, okunamayan tek gömlekleri tercih ederseniz:

find -type f|while read file;do [ "`head -c3 -- "$file"`" == $'\xef\xbb\xbf' ] && echo "found BOM in: $file";done

It doesn't work with filenames that contain a line break, but such files are not to be expected anyway.

Herhangi bir kısa ya da daha şık bir çözüm var mı?

Metin editörleri için herhangi bir ilginç metin editörleri veya makro var mı?

9 Cevap

Ne sadece bulur ama kötü Reçetesi temizler değil bu basit bir komut hakkında? :)

find . -type f -exec sed '1s/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;

Ben "bulmak" aşk :)

Sadece BOM dosyaları göstermek istiyorsanız, bu birini kullanın:

grep -rl $'\xEF\xBB\xBF' .

Windows bunu İYİ KOLAY yolu:

toplam komutanı -> projenin kök dizinine gidin -> dosya (alt + f7) bulabilirsiniz -> dosya türleri * -.> Metin "EF BB BF" Bul -> 'Hex' onay kutusunu işaretleyin -> arama

ve listesini almak :)

find . -type f -print0 | xargs -0r awk '
    /^\xEF\xBB\xBF/ {print FILENAME}
    {nextfile}'

(Örneğin Marcus'un çözeltisi gibi) sonra bazı sonuçlara filtre bile çözümlerin çoğu, dosyanın ilk satırında daha testinde yukarıda verilmiştir. Biraz daha hızlı olmalı bu çözüm sadece her dosyanın ilk satırı sınar.

Bazı yanlış pozitif (durumda olmayan metin dosyaları vardır, ya olası durumda bir dosya ortasında bir ZWNBSP vardır) kabul ederseniz, grep kullanabilirsiniz:

fgrep -rl `echo -ne '\xef\xbb\xbf'` .

Ben gibi bir şey kullanmak istiyorsunuz:

grep -orHbm1 "^`echo -ne '\xef\xbb\xbf'`" . | sed '/:0:/!d;s/:0:.*//'

BOM dosyasının ilk bayt başlayarak meydana sağlamak hangi.

Windows kullanıcı için, bkz: this. (Bulmak için iyi bir php script BOM projenizde)

Bu bir overkill çözüm özellikle PHP arar aynı adı) ile phptags (not the vi aracıdır:

phptags --warn ./

Çıktısı gibi bir şey:

./invalid.php: TRAILING whitespace ("?>\n")
./invalid.php: UTF-8 BOM alone ("\xEF\xBB\xBF")

Ve --whitespace modu otomatik (ardışık, ancak yalnızca yeniden yazar o. Php scriptler belirtmektedir.) Bu tür sorunları çözecektir

Ben sadece javascript dosyaları düzeltmek için bu kullandı:

find . -iname *.js -type f -exec sed 's/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;

Sen grep bu yüzden gibi onları soyarak ve Perl bulmak için kullanabilirsiniz:

grep -rl $'\xEF\xBB\xBF' . | xargs perl -i -pe 's{\xEF\xBB\xBF}{}'