Risposte:
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
/ todos
e dos2unix
/ unix2dos
che fanno questo per te. È possibile utilizzare find
: find . -type f -name '*.php' -exec dos2unix '{}' +
.
Esistono diversi programmi dedicati, tra cui
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 globstar
prima eseguire (puoi mettere questa linea nel tuo ~/.bashrc
). Puoi usare **/
in ksh93, ma devi set -o globstar
prima eseguire (puoi mettere questa linea nel tuo ~/.kshrc
.
Se è possibile utilizzare solo gli strumenti che richiedono un reindirizzamento, utilizzare un for
ciclo.
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 find
comando. 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 .o
e nelle sottodirectory chiamate bin
.
find -name 'bin' -type d -prune -o \
\! -name '*.o' \
-exec sed -i -e 's/\r\+$//' {} +
Ecco un esempio POSIX. Diciamo find
di 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 find
metodo 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
' _ {} +
Anche Winscp si convertirà automaticamente, se detto .
Se i tuoi file risiedono tutti nella stessa directory:
DIRECTORY=/your/directory
unix2dos $DIRECTORY/*