Do celów debugowania muszę rekurencyjnie przeszukiwać katalog dla wszystkich plików, które zaczynają się od znacznika kolejności bajtów UTF-8 (BOM). Moje obecne rozwiązanie to prosty skrypt powłoki:
find -type f |
while read file
do
if [ "`head -c 3 -- "$file"`" == $'\xef\xbb\xbf' ]
then
echo "found BOM in: $file"
fi
done
Lub, jeśli wolisz krótkie, nieczytelne jednowierszowe:
find -type f|while read file;do [ "`head -c3 -- "$file"`" == $'\xef\xbb\xbf' ] && echo "found BOM in: $file";done
Nie działa z nazwami plików, które zawierają podział wiersza, ale takich plików i tak nie należy się spodziewać.
Czy jest jakieś krótsze lub bardziej eleganckie rozwiązanie?
Czy są jakieś interesujące edytory tekstu lub makra do edytorów tekstu?
źródło
grep -rlI $'\xEF\xBB\xBF' .
do ignorowania plików binarnych.Najlepszy i najłatwiejszy sposób na zrobienie tego w systemie Windows:
Total Commander → przejdź do katalogu głównego projektu → znajdź pliki ( Alt+F7 ) → typy plików *. * → Znajdź tekst „EF BB BF” → zaznacz pole wyboru „Hex” → szukaj
I dostajesz listę :)
źródło
find . -type f -print0 | xargs -0r awk ' /^\xEF\xBB\xBF/ {print FILENAME} {nextfile}'
Większość podanych powyżej rozwiązań testuje więcej niż pierwszy wiersz pliku, nawet jeśli niektóre (na przykład rozwiązanie Marcusa) filtrują wyniki. To rozwiązanie testuje tylko pierwszą linię każdego pliku, więc powinno być trochę szybsze.
źródło
find . -type f -print0 | xargs -0 awk '/^\xEF\xBB\xBF/ {print FILENAME} {nextfile}'
Jeśli akceptujesz fałszywe alarmy (w przypadku, gdy istnieją pliki nietekstowe lub w mało prawdopodobnym przypadku w środku pliku znajduje się ZWNBSP), możesz użyć grep:
fgrep -rl `echo -ne '\xef\xbb\xbf'` .
źródło
Użyłbym czegoś takiego:
grep -orHbm1 "^`echo -ne '\xef\xbb\xbf'`" . | sed '/:0:/!d;s/:0:.*//'
Co zapewni, że zestawienie komponentów zacznie się od pierwszego bajtu pliku.
źródło
Możesz użyć,
grep
aby je znaleźć i Perla, aby je rozebrać w następujący sposób:grep -rl $'\xEF\xBB\xBF' . | xargs perl -i -pe 's{\xEF\xBB\xBF}{}'
źródło
Dla użytkownika Windows zobacz to (dobry skrypt PHP do znajdowania
BOM
w twoim projekcie).źródło
Przesadnym rozwiązaniem tego problemu jest
phptags
(nievi
narzędzie o tej samej nazwie), które w szczególności szuka skryptów PHP:phptags --warn ./
Wyświetli coś takiego:
./invalid.php: TRAILING whitespace ("?>\n") ./invalid.php: UTF-8 BOM alone ("\xEF\xBB\xBF")
Oraz
--whitespace
tryb automatycznie rozwiązać takie problemy (rekurencyjnie, ale twierdzi, że to tylko przepisuje skrypty .php).źródło
find -type f -print0 | xargs -0 grep -l `printf '^\xef\xbb\xbf'` | sed 's/^/found BOM in: /'
find -print0
umieszcza null \ 0 między każdą nazwą pliku zamiast używać nowych liniixargs -0
oczekuje argumentów oddzielonych od wartości null zamiast oddzielonych wierszamigrep -l
wyświetla pliki, które pasują do wyrażenia regularnego^\xeff\xbb\xbf
nie jest do końca poprawne, ponieważ będzie pasowało do plików UTF-8 bez zestawienia komponentów, jeśli mają one zerową szerokość spacji na początku wierszaźródło
Użyłem tego do poprawienia tylko plików JavaScript:
find . -iname *.js -type f -exec sed 's/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;
źródło
Jeśli szukasz plików UTF, polecenie pliku działa. Powie ci, jakie jest kodowanie pliku. Jeśli są tam jakieś znaki spoza ASCII, pojawi się UTF.
file *.php | grep UTF
To nie zadziała jednak rekurencyjnie. Prawdopodobnie możesz skonfigurować jakieś wymyślne polecenie, aby było rekurencyjne, ale po prostu przeszukałem każdy poziom indywidualnie, tak jak poniżej, aż zabrakło mi poziomów.
file */*.php | grep UTF
źródło