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 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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top