Bir dosya sistemi dalındaki tüm dosyayı Unix ve Windows satır sonu biçimi arasında toplu olarak dönüştürmek nasıl?


14

Herkes bilir :-) Windows düz metin dosyalarında satırlar CR + LF ile ve Unix & Linux'da - sadece LF ile sonlandırılır. Tüm kaynak kodu dosyalarımı bir biçimden diğerine ve geriye nasıl hızlı bir şekilde dönüştürebilirim?

Yanıtlar:


17

Bu duruma göre değişir: dosyalar sürüm kontrolü altındaysa, bu oldukça popüler olmayan bir tarihi kirletici karar olabilir. Git, check-out sırasında satır sonlarını otomatik olarak dönüştürme seçeneğine sahiptir.

Eğer umursamıyorsanız ve hızlı bir şekilde dönüştürmek istiyorsanız, fromdos/ todosve dos2unix/ gibi programları unix2dossizin için yapar. Sen kullanabilirsiniz find: find . -type f -name '*.php' -exec dos2unix '{}' +.


7

Aşağıdakiler de dahil olmak üzere çeşitli özel programlar vardır

  • dos2unixve unix2dosgelen dos2unix araçları
  • todosve fromdosgelen tofrodos araçları

Sadece uygun yön için aracı seçin ve dönüştürülecek dosyaların adlarını komut satırına iletin.


Bunlardan birine sahip değilseniz, ancak Linux veya Cygwin'iniz varsa:

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

Perl'iniz varsa:

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

Yalnızca POSIX araçlarıyla (BusyBox dahil), unix'ten dos'ya geçmek için CR karakterini tam anlamıyla sed komutuna iletmeniz gerekir.

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

Diğer yönde, tüm CR'leri silebilirsiniz:

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

Aynı dizindeki birçok dosyayı bir kerede dönüştürmek için joker karakterler kullanabilirsiniz, ör.

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

Geçerli dizindeki ve alt dizinlerindeki tüm dosyaları dönüştürmek için kabuğunuz zsh ise **/, örn.

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

**/Bash ≥4 içinde kullanabilirsiniz , ancak shopt -s globstarönce çalıştırmanız gerekir (bu satırı içine koyabilirsiniz ~/.bashrc). **/Ksh93 içinde kullanabilirsiniz , ancak önce koşmanız gerekir set -o globstar(bu satırı içine koyabilirsiniz ~/.kshrc.

Yalnızca yeniden yönlendirme gerektiren araçları kullanabiliyorsanız, bir fordöngü kullanın .

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

**/Hangi dosyaların dönüştürüleceğini seçmek için daha karmaşık bir eşleşmeye sahip değilseniz veya ihtiyacınız yoksa , findkomutu kullanın. Burada, denilen .oalt dizinlerin altındaki ve altındaki dosyalar hariç, geçerli dizinin ve alt dizinlerinin altındaki tüm dosyaları yinelemeli olarak dönüştüren bir Linux / Cygwin örneği verilmiştir bin.

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

İşte bir POSIX örneği. findGerekli yeniden yönlendirmeyi gerçekleştirebilecek bir kabuk başlatmayı söylüyoruz .

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

findKabuk komutunda bir döngü kullanarak yöntemi daha karmaşık kod pahasına biraz daha hızlı yapabilirsiniz .

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

winscp de söylendiğinde otomatik olarak dönüştürülecektir .

Dosyalarınız aynı dizinde bulunuyorsa:

DIRECTORY=/your/directory
unix2dos $DIRECTORY/*

WinSCP ile nasıl başaracağınızı biraz daha açıklayabilir misiniz?
harish sharma

@harishsharma Ben "söyledim" için bir bağlantı obove ekledim.
Nils
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.