Come convertire in blocco tutti i file in un ramo del file system tra il formato di interruzione di riga Unix e Windows?


14

Tutti sanno :-) che in Windows le file di testo in chiaro terminano con CR + LF e in Unix e Linux - solo con LF. Come posso convertire rapidamente tutti i miei file di codice sorgente da un formato all'altro e viceversa?

Risposte:


17

Dipende da: se i file sono sotto il controllo della versione, questa potrebbe essere una decisione piuttosto impopolare di inquinamento della storia. Git ha la possibilità di convertire automagicamente le terminazioni di linea al momento del check-out.

Se non ti interessa e vuoi convertire rapidamente, ci sono programmi come fromdos/ todose dos2unix/ unix2dosche fanno questo per te. È possibile utilizzare find: find . -type f -name '*.php' -exec dos2unix '{}' +.


7

Esistono diversi programmi dedicati, tra cui

  • dos2unixe unix2dosdagli strumenti dos2unix
  • todose fromdosdagli strumenti di tofrodos

Basta scegliere lo strumento per la direzione appropriata e passare i nomi dei file da convertire sulla riga di comando.


Se non ne hai nemmeno uno, ma hai Linux o Cygwin:

sed -i -e 's/\r\+$//' filename             # dos|unix -> unix
sed -i -e 's/\r*$/\r/' filename            # dos|unix -> dos

Se hai il perl:

perl -i -pe 's/\r+$//' filename            # dos|unix -> unix
perl -i -pe 's/\r*$/\r/' filename          # dos|unix -> dos

Con solo gli strumenti POSIX (incluso BusyBox), per passare da unix a dos, dovrai passare letteralmente il carattere CR nel comando sed.

cr=$(echo | tr '\n' '\r')
sed -e "s/$cr*\$/$cr/" <filename >filename.dos
mv filename.dos filename

Nella direzione opposta, puoi semplicemente eliminare tutti i CR:

tr -d '\r' <filename >filename.dos
mv filename.dos filename

È possibile utilizzare i caratteri jolly per convertire contemporaneamente più file nella stessa directory, ad es

sed -i -e 's/\r\+$//' *.txt

Per convertire tutti i file nella directory corrente e nelle sue sottodirectory, se la tua shell è zsh, puoi usare **/, ad es

sed -i -e 's/\r\+$//' **/*.txt

Puoi usare **/bash ≥4, ma devi shopt -s globstarprima eseguire (puoi mettere questa linea nel tuo ~/.bashrc). Puoi usare **/in ksh93, ma devi set -o globstarprima eseguire (puoi mettere questa linea nel tuo ~/.kshrc.

Se è possibile utilizzare solo gli strumenti che richiedono un reindirizzamento, utilizzare un forciclo.

for x in *.txt; do
  tr -d '\r' <"$x" >"$x.dos"
  mv -- "$x.dos" "$x"
done

Se non hai **/o hai bisogno di una corrispondenza più complessa per selezionare quali file convertire, usa il findcomando. Ecco un esempio di Linux / Cygwin che converte tutti i file nella directory corrente e nelle sue sottodirectory in modo ricorsivo, ad eccezione dei file chiamati .oe nelle sottodirectory chiamate bin.

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sed -i -e 's/\r\+$//' {} +

Ecco un esempio POSIX. Diciamo finddi avviare una shell in grado di eseguire il reindirizzamento necessario.

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sh -c '
       tr -d '\r' <"$0" >"$0.dos"
       mv -- "$0.dos" "$0"
' {} \;

Puoi rendere il findmetodo leggermente più veloce, a scapito di un codice più complesso, usando un ciclo nel comando shell.

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sh -c '
       for x; do
         tr -d '\r' <"$x" >"$x.dos"
         mv -- "$x.dos" "$x"
       done
' _ {} +

2

Anche Winscp si convertirà automaticamente, se detto .

Se i tuoi file risiedono tutti nella stessa directory:

DIRECTORY=/your/directory
unix2dos $DIRECTORY/*

Puoi per favore descrivere un po 'di più, come ottenere attraverso WinSCP?
harish sharma,

@harishsharma Ho aggiunto un link sopra a "detto così".
Nils,
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.