Modo elegante per cercare file UTF-8 con BOM?
-
03-07-2019 - |
Domanda
Ai fini del debug, devo cercare ricorsivamente in una directory tutti i file che iniziano con un segno di ordine di byte UTF-8 (BOM). La mia soluzione attuale è un semplice script di shell:
find -type f |
while read file
do
if [ "`head -c 3 -- "$file"`" ==
In alternativa, se si preferisce una riga breve e illeggibile:
find -type f|while read file;do [ "`head -c3 -- "$file"`" ==
Non funziona con nomi di file che contengono un'interruzione di riga,
ma tali file non sono prevedibili comunque.
Esiste una soluzione più breve o più elegante?
Esistono editor di testo o macro interessanti per gli editor di testo?
\xef\xbb\xbf' ]
then
echo "found BOM in: $file"
fi
done
In alternativa, se si preferisce una riga breve e illeggibile:
<*>
Non funziona con nomi di file che contengono un'interruzione di riga,
ma tali file non sono prevedibili comunque.
Esiste una soluzione più breve o più elegante?
Esistono editor di testo o macro interessanti per gli editor di testo?
\xef\xbb\xbf' ] && echo "found BOM in: $file";done
Non funziona con nomi di file che contengono un'interruzione di riga, ma tali file non sono prevedibili comunque.
Esiste una soluzione più breve o più elegante?
Esistono editor di testo o macro interessanti per gli editor di testo?
\xef\xbb\xbf' ] then echo "found BOM in: $file" fi doneIn alternativa, se si preferisce una riga breve e illeggibile:
<*>Non funziona con nomi di file che contengono un'interruzione di riga, ma tali file non sono prevedibili comunque.
Esiste una soluzione più breve o più elegante?
Esistono editor di testo o macro interessanti per gli editor di testo?
Soluzione
Che dire di questo semplice comando che non solo trova, ma cancella la BOM brutta? :)
find . -type f -exec sed '1s/^\xEF\xBB\xBF//' -i {} \;
Amo " find " :)
Avviso Quanto sopra modificherà i file binari che contengono questi tre caratteri.
.
Se vuoi solo mostrare i file DBA, usa questo:
grep -rl \xEF\xBB\xBF' .
Altri suggerimenti
Il modo migliore e più semplice per farlo su Windows:
Total Commander ? vai alla directory principale del progetto ? trova i file ( Alt + F7 ) ? tipi di file *. * ? Trova testo " EF BB BF " ? seleziona la casella di controllo "Esadecimale" ? cerca
E ottieni l'elenco :)
find . -type f -print0 | xargs -0r awk '
/^\xEF\xBB\xBF/ {print FILENAME}
{nextfile}'
La maggior parte delle soluzioni fornite sopra verifica più della prima riga del file, anche se alcune (come la soluzione di Marcus) filtrano i risultati. Questa soluzione verifica solo la prima riga di ogni file, quindi dovrebbe essere un po 'più veloce.
Se si accettano alcuni falsi positivi (nel caso in cui vi siano file non di testo o nel caso improbabile ci sia uno ZWNBSP nel mezzo di un file), è possibile utilizzare grep:
fgrep -rl `echo -ne '\xef\xbb\xbf'` .
Vorrei usare qualcosa del tipo:
grep -orHbm1 "^`echo -ne '\xef\xbb\xbf'`" . | sed '/:0:/!d;s/:0:.*//'
Che assicurerà che la distinta base si verifichi a partire dal primo byte del file.
Puoi usare grep
per trovarli e Perl per eliminarli in questo modo:
grep -rl \xEF\xBB\xBF' . | xargs perl -i -pe 's{\xEF\xBB\xBF}{}'
Per un utente Windows, vedi questo (buon script PHP per trovare il BOM nel tuo progetto).
Una soluzione eccessiva a questo è phptags
(non il vi
con lo stesso nome), che cerca specificamente gli script PHP:
phptags --warn ./
Produrrà qualcosa del tipo:
./invalid.php: TRAILING whitespace ("?>\n")
./invalid.php: UTF-8 BOM alone ("\xEF\xBB\xBF")
E la modalità --whitespace
risolverà automaticamente tali problemi (ricorsivamente, ma afferma che riscrive solo gli script .php.)
find -type f -print0 | xargs -0 grep -l `printf '^\xef\xbb\xbf'` | sed 's/^/found BOM in: /'
-
trova -print0
inserisce un valore nullo \ 0 tra ciascun nome di file anziché utilizzare nuove righe -
xargs -0
prevede argomenti nulli separati anziché separati da linea -
grep -l
elenca i file che corrispondono alla regex - Il regex
^ \ xeff \ xbb \ xbf
non è del tutto corretto, poiché corrisponderà ai file UTF-8 non BOMed se hanno spazi di larghezza zero all'inizio di una riga
L'ho usato per correggere solo i file JavaScript:
find . -iname *.js -type f -exec sed 's/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;
Se stai cercando file UTF, il comando file funziona . Ti dirà qual è la codifica del file. Se sono presenti caratteri non ASCII, verrà visualizzato UTF.
file *.php | grep UTF
Tuttavia non funzionerà in modo ricorsivo. Probabilmente puoi inventare qualche comando elaborato per renderlo ricorsivo, ma ho appena cercato ogni livello individualmente come il seguente, fino a quando non ho finito i livelli.
file */*.php | grep UTF