Unix और Windows लाइन ब्रेक प्रारूप के बीच फ़ाइल सिस्टम शाखा में सभी फ़ाइल को बल्क में कैसे बदला जाए?


14

हर कोई जानता है कि :-) विंडोज में सादे पाठ फ़ाइलों को सीआर + एलएफ के साथ, और यूनिक्स और लिनक्स में - केवल एलएफ के साथ समाप्त किया जाता है। मैं अपने सभी स्रोत कोड फ़ाइलों को जल्दी से एक प्रारूप से दूसरे और पीछे कैसे बदल सकता हूं?

जवाबों:


17

यह निर्भर करता है: यदि फ़ाइलें संस्करण नियंत्रण में हैं, तो यह एक बल्कि अलोकप्रिय इतिहास-प्रदूषणकारी निर्णय हो सकता है। Git के पास चेक-आउट पर स्वचालित रूप से लाइन अंत को बदलने का विकल्प है।

यदि आप परवाह नहीं करते हैं और जल्दी से बदलना चाहते हैं, तो fromdos/ todosऔर dos2unix/ जैसे कार्यक्रम हैं unix2dosजो आपके लिए ऐसा करते हैं। आप उपयोग कर सकते हैं find: find . -type f -name '*.php' -exec dos2unix '{}' +


7

सहित कई समर्पित कार्यक्रम हैं

  • dos2unixऔर unix2dosसे dos2unix उपकरण
  • todosऔर fromdosसे tofrodos उपकरण

बस उचित दिशा के लिए उपकरण चुनें और कमांड लाइन पर कनवर्ट करने के लिए फ़ाइलों के नाम पास करें।


यदि आपके पास या तो नहीं है, लेकिन लिनक्स या सिगविन है:

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

यदि आपके पास पर्ल है:

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

यूनिक्स से डॉस तक जाने के लिए केवल पॉज़िक्स टूल (बिजीबॉक्स सहित) के साथ, आपको सीआर कमांड को सचमुच कमांड कमांड में पास करना होगा।

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

दूसरी दिशा में, आप बस सभी सीआर को हटा सकते हैं:

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

आप वाइल्डकार्ड का उपयोग एक ही बार में एक ही निर्देशिका में कई फ़ाइलों को परिवर्तित करने के लिए कर सकते हैं, जैसे

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

वर्तमान निर्देशिका और उसकी उपनिर्देशिकाओं में सभी फ़ाइलों को परिवर्तित करने के लिए, यदि आपका शेल zsh है, तो आप उपयोग कर सकते हैं **/, जैसे

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

आप **/बैश ,4 में उपयोग कर सकते हैं , लेकिन आपको shopt -s globstarपहले चलाने की जरूरत है (आप इस लाइन को अपने में डाल सकते हैं ~/.bashrc)। आप **/ksh93 में उपयोग कर सकते हैं , लेकिन आपको set -o globstarपहले चलाने की आवश्यकता है (आप इस लाइन को अपने में डाल सकते हैं ~/.kshrc

यदि आप केवल उन उपकरणों का उपयोग कर सकते हैं जिनके लिए पुनर्निर्देशन की आवश्यकता होती है, तो forलूप का उपयोग करें ।

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

यदि आपके पास यह **/चुनने के लिए अधिक जटिल मिलान की आवश्यकता नहीं है कि कौन सी फ़ाइलों का चयन करें, तो findकमांड का उपयोग करें । यहाँ एक लिनक्स / साइग्विन उदाहरण दिया गया है, जो वर्तमान निर्देशिका और इसके उपनिर्देशिकाओं के तहत सभी फ़ाइलों को पुनरावृत्ति करता है, जिन्हें बुलाया फ़ाइलों .oऔर उपनिर्देशिकाओं के तहत बुलाया जाता है bin

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

यहाँ एक POSIX उदाहरण है। हम findएक शेल शुरू करने के लिए कहते हैं जो आवश्यक पुनर्निर्देशन कर सकता है।

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

findशेल कमांड में लूप का उपयोग करके आप अधिक जटिल कोड की कीमत पर विधि को थोड़ा तेज कर सकते हैं ।

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

अगर बता दिया जाए तो wincp ऑटो-कन्वर्ट भी हो जाएगा ।

यदि आपकी फाइलें एक ही डायरेक्टरी में रहती हैं:

DIRECTORY=/your/directory
unix2dos $DIRECTORY/*

क्या आप कृपया थोड़ा और वर्णन कर सकते हैं, WinSCP के माध्यम से कैसे प्राप्त करें?
कठोर शर्मा

@harishsharma मैंने "ऐसा बताया" के लिए एक लिंक ओबॉव जोड़ा।
निल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.