2012-05-17 10 views

risposta

7

È possibile utilizzare del sed -i bandiera per modificare i file sul posto:

find . -type f -exec sed -i 's/\x0d//g' {} \+ 

Se fossi in te, vorrei mantenere i file in giro per assicurarsi che l'operazione è andata bene. Quindi puoi cancellare i file temporanei quando hai finito. Questo può essere fatto in questo modo:

find . -type f -exec sed -i'.OLD' 's/\x0d//g' {} \+ 
find . -type f -name '*.OLD' -delete 
+0

Questo dovrebbe gestire i nomi di file che contengono spazi bianchi. Non aggiungendo una nuova riga alla fine di ogni riga, i file diverranno a doppia spaziatura o persino a spaziatura tripla (dal momento che stai sostituendo i ritorni a capo con le nuove righe)? Sì, l'ho appena provato. –

+0

@DennisWilliamson L'ho appena strappato da una sceneggiatura che ho in ufficio senza nemmeno pensarci due volte. Ora mi chiedo come funzionano quegli script. (Potrebbe avere a che fare con il fatto che erano pensati per convertire i file creati in Microsoft Office per Mac.) La nuova versione dovrebbe funzionare correttamente. –

2

Avete nomi di file e nomi di directory sane senza spazi, ecc.?

Se è così, non è troppo difficile. Se hai a che fare con nomi arbitrari contenenti newline e spazi, ecc, allora devi lavorare più duramente di così.

tmp=${TMPDIR:-/tmp}/crlf.$$ 
trap "rm -f $tmp.?; exit 1" 0 1 2 3 13 15 

find . -type f -print | 
while read name 
do 
    tr -d '\015' < $name > $tmp.1 
    mv $tmp.1 $name 
done 

rm -f $tmp.? 
trap 0 
exit 0 

La trappola garantisce che non vengano lasciati file temporanei. Ci sono altri trucchi che puoi tirare, con più nomi casuali per i tuoi nomi di file temporanei. Normalmente non ne hai bisogno a meno che non lavori in un ambiente ostile.

+0

Nota che 'tr' in realtà riconosce' \ r' (entrambe le varianti BSD e GNU), quindi puoi usare 'tr -d '\ r''. –

11

Per tutti i file nella directory corrente che si possono fare con un Perl one-liner: perl -pi -e 's/\r\n/\n/g' * (rubato da here)

EDIT: E con una piccola modifica si può fare la ricorsione sottodirectory:

find | xargs perl -pi -e 's/\r\n/\n/g' 
+2

Se il tuo 'find' e' xargs' lo supportano: 'find -print0 | xargs -0 ... 'gestirà i nomi di file con spazi bianchi. –

+3

Attenzione se si utilizza questo comando su * repository Git *. Escludere la sottodirectory '.git' da find. – prajmus

1

È inoltre possibile utilizzare l'editor in modalità batch.

find . -type f -exec bash -c 'echo -ne "%s/\\\r//\nx\n" | ex "{}" ' \; 
+0

Questa soluzione è stata l'unica che ha funzionato per me su Mac OS X. Gli altri sono rimasti bloccati su vari problemi come "Impossibile eseguire la modifica sul posto: ./lang non è un file normale, <> riga 22167. – WilliamKF

0

Se \r non è seguito da \n (forse il caso di file di Tim Pote):

  • eliminazione \r (usando tr -d) può togliere a capo
  • sostituzione \r con \n non possono causa new/triple newlines

Forse Tim Pote potrebbe verificare i punti sopra per i file che ha menzionato.

+0

mi sembra un buon commento sulla risposta di Tim Pote, ma non è molto chiaro su come effettivamente risponde alla domanda. –

Problemi correlati