Un modo elegante per cercare file UTF-8 con BOM?


94

Per scopi di debug, è necessario cercare in modo ricorsivo una directory per tutti i file che iniziano con un contrassegno di ordine di byte (BOM) UTF-8. La mia soluzione attuale è un semplice script di shell:

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

Oppure, se preferisci le battute brevi e illeggibili:

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

Non funziona con i nomi di file che contengono un'interruzione di riga, ma tali file non sono comunque prevedibili.

Esiste una soluzione più corta o più elegante?

Esistono editor di testo o macro interessanti per gli editor di testo?

Risposte:


166

Che dire di questo semplice comando che non solo trova ma cancella la brutta BOM? :)

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

Adoro "trovare" :)

Avviso Quanto sopra modificherà i file binari che contengono questi tre caratteri.

Se vuoi solo mostrare i file BOM, usa questo:

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

9
Rileva in modo errato il PDF con un marcatore BOM .. è perché cerca l'intero documento, non solo la prima riga
Olivier Refalo

1
O con ack: "ack '\ xEF \ xBB \ xBF'"
Smar

5
cambia il comando sed per aggiungere un 1 prima della 's' iniziale in modo che si applichi solo alla prima riga
Ben Combee

27
Utilizzare grep -rlI $'\xEF\xBB\xBF' .per ignorare i file binari.
dbernard

1
Rileva e modifica JPG e altri file binari, come già detto.
Jehy

41

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 il testo "EF BB BF" → seleziona la casella di controllo 'Hex' → cerca

E ottieni l'elenco :)


4
Bello, soprattutto l'uso del mio Total commander preferito da sempre, ma purtroppo soffre dello stesso problema di molti altri: cerca tutti i byte in un file, quindi vengono segnalate molte immagini ecc. Questo può essere leggermente migliorato usando RegEx invece di Hex e cercando "^ \ xEF \ xBB \ xBF" che eliminerà molte immagini ma ha ancora file che hanno la distinta componenti a metà del file (anche se dovrebbero essercene pochi) e ovviamente qualsiasi file binario a cui capita di avere un charcode di nuova riga ASCII appena prima del BOM. Tuttavia, tutte le immagini erano sparite nella mia ricerca di prova.
Legolas

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

La maggior parte delle soluzioni fornite sopra testano 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.


1
Got sta lavorando con quanto segue su Linux (RHEL6) -find . -type f -print0 | xargs -0 awk '/^\xEF\xBB\xBF/ {print FILENAME} {nextfile}'
Olivier Refalo

Come devo modificare il codice per correggere questi file dopo che sono stati trovati?
Nero

7

Se accetti dei falsi positivi (nel caso in cui ci siano file non di testo, o nel caso improbabile ci sia uno ZWNBSP nel mezzo di un file), puoi usare grep:

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

5

Userei qualcosa come:

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

Ciò garantirà che la distinta materiali avvenga a partire dal primo byte del file.


5

Puoi usarli grepper trovarli e Perl per rimuoverli in questo modo:

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

Questo ha funzionato per me, la risposta accettata no (sono su un Mac)
mjsarfatti

4

Per un utente Windows, guarda questo (buon script PHP per trovare il file BOMnel tuo progetto).


Il sito web collegato mostra: "Sito web offline, nessuna versione cache disponibile".
vog

lo stesso script è disponibile anche in github: github.com/emrahgunduz/BomCleaner
emrahgunduz

Grazie amico, la tua risposta mi ha salvato la giornata.
Krunal Panchal

E un BOM Finder: github.com/svn2github/wikia/blob/master/extensions/FCKeditor/… (nel caso in cui a qualcuno non piaccia la pulizia 'automatica', o semplicemente voglia trovare i file con BOM)
meloniq

3

Una soluzione eccessiva a questo è phptags(non lo vistrumento con lo stesso nome), che cerca specificamente gli script PHP:

phptags --warn ./

Produrrà qualcosa come:

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

E la --whitespacemodalità risolverà automaticamente tali problemi (in modo ricorsivo, ma afferma che riscrive solo gli script .php.)


2
find -type f -print0 | xargs -0 grep -l `printf '^\xef\xbb\xbf'` | sed 's/^/found BOM in: /'
  • find -print0 inserisce un null \ 0 tra ogni nome di file invece di utilizzare nuove righe
  • xargs -0 si aspetta argomenti separati da null invece che separati da righe
  • grep -l elenca i file che corrispondono alla regex
  • La regex ^\xeff\xbb\xbfnon è del tutto corretta, in quanto corrisponderà a file UTF-8 non BOM se hanno spazi di larghezza zero all'inizio di una riga

Hai ancora bisogno di una "testa 1" nel tubo prima del grep
MSalters

2

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 \;

0

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 creare qualche comando di fantasia per renderlo ricorsivo, ma ho cercato individualmente ogni livello come segue, fino a quando non ho esaurito i livelli.

file */*.php | grep UTF
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.