मैं पूरी निर्देशिका पर dos2unix कैसे चला सकता हूं? [बन्द है]


333

मुझे एक पूरी निर्देशिका का उपयोग करके परिवर्तित करना होगा dos2unix। मैं यह पता लगाने में सक्षम नहीं हूं कि यह कैसे करना है।

जवाबों:


591

find . -type f -print0 | xargs -0 dos2unix

वर्तमान निर्देशिका के अंदर सभी फ़ाइलों को पुन: खोज लेंगे और इन फ़ाइलों के लिए कॉल करेंगे dos2unix कमांड


94
यदि आपके पास फ़ाइल नाम में रिक्त स्थान है तो टूट जाएगा। find . -type f -print0 | xargs -0 dos2unixमेरे विचार से समस्या का समाधान होगा।
नौफल इब्राहिम

1
मैं इस तरह दिया। -Type f -exec dos2unix {} / home / venuk / Desktop / NEO_Src और इसने त्रुटि दी: '-exec' को लापता तर्क
विवेक गौर

1
ध्यान दें कि सेमी-कॉलोन से बचने वाले बैकस्लैश यह सुनिश्चित करते हैं कि dos2unix कमांड सेमी-कॉलन द्वारा अलग हो जाएं ताकि वे एक साथ मैश न हो जाएं। यदि आप बाद में एक और कमांड चलाना चाहते हैं, तो आपको एक और अर्ध-उपनिवेश की आवश्यकता होगी, इसलिए\;; echo Hello
जोश

1
इस आदेश के साथ सावधान रहें, हालांकि यह जाँच नहीं करता है कि क्या फ़ाइल को रूपांतरण की आवश्यकता है, इसलिए यहां तक ​​कि द्विआधारी फ़ाइलों को "परिवर्तित" किया जाएगा, उन्हें भ्रष्ट किया जाएगा।
vguzmanp

2
@vguzmanp सच है, findमंगलाचरण यह जांच नहीं करता है (हालांकि यह जोड़ना आसान होगा), लेकिन आधुनिक dos2unixसही ढंग से द्विआधारी फ़ाइलों को छोड़ देता है।
काइल स्ट्रैंड

68

यदि यह एक बड़ी निर्देशिका है, तो आप कई प्रोसेसर के साथ चलने पर विचार कर सकते हैं:

find . -type f -print0 | xargs -0 -n 1 -P 4 dos2unix 

यह एक बार में 1 फ़ाइल पास करेगा, और 4 प्रोसेसर का उपयोग करेगा।


1
इस पद्धति का लाभ है, कि यह जारी है, भले ही dos2unix किसी भी समस्या का सामना करता है! एक "--फोर्स" विधि जैसा कुछ। उसके लिये आपका धन्यवाद!
फ्रीओ

वाह - बस मुझे एक विंडोज डेवलपर्स कोड परिवर्धन में बदलने की कोशिश करते समय समस्या को हल करने में बहुत बचत हुई, जिसमें बिस्तर को गलत तरीके से जोड़ा गया था। धन्यवाद!!
द नेटयेटी

1
प्रत्येक व्यक्तिगत फ़ाइल के लिए एक नई dos2unix प्रक्रिया शुरू करने से बड़े पैमाने पर अनावश्यक ओवरहेड का परिचय होगा। मैं उस nपरिमाण या दो के क्रम से
टकराऊंगा

25

जैसा कि मैं dos2unix द्वारा खराब रूप से संतुष्ट होने के लिए हुआ, मैंने अपनी सरल उपयोगिता को रोल आउट किया। गति और पूर्वानुमेयता में कुछ लाभों के अलावा, वाक्यविन्यास भी थोड़ा सरल है:

endlines unix *

और अगर आप चाहते हैं कि यह उपनिर्देशिकाओं (छिपी हुई डायरियों और गैर-पाठ फ़ाइलों को छोड़ दे) में चला जाए:

endlines unix -r .

endlinesयहाँ उपलब्ध है https://github.com/mdolidon/endlines


1
यह पूर्ण है! सबसे नज़दीकी एक-लाइनर जो मुझे मिल सकता है, वह यहां है: unix.stackexchange.com/a/365679/112190
phyatt

2
इसमें सुधार कैसे होता है dos2unix? वास्तव में जिज्ञासु।
Walf

3
1 / मुख्य रूप से, dos2unixअलग-अलग क्षमता के टन होते हैं , (उदाहरण के लिए कुछ यूटीएफ 32 पढ़ते हैं, जबकि कुछ खोते हैं; एंडलाइन्स ऐसा नहीं करता है)। केवल एक ही है endlines, जो क्षमताओं को अच्छी तरह से जाना जाता है। इनपुट पर 2 / उदार, सभी नहीं dos2unixहैं। 3 / कुशल फाइल ट्री एक्सप्लोरेशन, जिसे हजारों फाइलों के लिए तेज और व्यावहारिक बनाया गया है। 4 / OSX पर बॉक्स से बाहर चलाता है - जो कम महत्वपूर्ण है कि ब्रू पैकेज मौजूद है।
मैथियास डोलिडन

1
मेरे मामले में यह वास्तव में है कि मुझे बहुत धन्यवाद की आवश्यकता है। स्वागत योग्य ट्रीप और व्रत निष्पादन समय को संसाधित करने का आसान तरीका है।
अलसावी

17

संभवतः छुपी हुई फ़ाइलों और फ़ोल्डरों को छोड़ना सबसे अच्छा है, जैसे कि .git.उपयोग करने के बजाय find, यदि आपका bashसंस्करण हाल ही में पर्याप्त है या यदि आप उपयोग कर रहे हैं zsh, तो बस करें:

dos2unix **

ध्यान दें कि बैश के लिए, इसकी आवश्यकता होगी:

shopt -s globstar

.... लेकिन यह एक उपयोगी पर्याप्त सुविधा है जिसे आपको ईमानदारी से इसे .bashrcवैसे भी अपने जीवन में रखना चाहिए ।

यदि आप छिपी हुई फ़ाइलों और फ़ोल्डरों को छोड़ना नहीं चाहते हैं, लेकिन आप अभी भी गड़बड़ नहीं करना चाहते हैं find(और मैं आपको दोष नहीं दूंगा), तो आप केवल छिपी हुई प्रविष्टियों से मिलान करने के लिए दूसरा पुनरावर्ती-ग्लोब तर्क प्रदान कर सकते हैं :

dos2unix ** **/.*

ध्यान दें कि दोनों मामलों में, ग्लोब का विस्तार निर्देशिकाओं को शामिल करने के लिए किया जाएगा, इसलिए आपको निम्नलिखित चेतावनी दिखाई देगी (संभावित रूप से कई बार): Skipping <dir>, not a regular file.


1
यह मेरे लिए काम नहीं किया। क्या ग्लोबस्टार सिंटेक्स dos2unix के लिए काम करता है? मैंने सफलता के साथ कहीं और ग्लोबस्टार का उपयोग किया है, लेकिन यह काम नहीं कर सका। मैं बैश 4.3.11 (1)
NS du Toit

@NSduToit * NIX शैली के गोले निष्पादक को तर्क-विस्तार के व्यवहार को बदलने की अनुमति नहीं देते हैं, क्योंकि (विंडोज के विपरीत) तर्क-विस्तार निष्पादन से पहले तर्कों को प्राप्त करने से पहले किया जाता है। तो केवल एक चीज जो मैं सोच सकता हूं, वह यह है कि आपके पास कुछ प्रकार के dos2unixउपनाम हैं जो प्रभावित कर रहे हैं कि कैसे तर्कों का विस्तार किया जाता है। type dos2unixआपके सिस्टम पर आउटपुट क्या है ?
काइल स्ट्रैंड

1
@NSduToit यहां कुछ भ्रम है। मेरा जवाब स्पष्ट रूप से कहा गया है कि बिंदु का उपयोग करने का **बजाय find"इस तरह के रूप में छिपा फ़ाइलों और फ़ोल्डरों, को छोड़ करने के लिए है .git"। dos2unixछिपी हुई फ़ाइलों को कभी नहीं देखता, क्योंकि **उन्हें दिखाने के लिए विस्तार नहीं होता है। यदि आप चाहते हैं स्वचालित रूप से चलाने के लिए dos2unixछिपा फ़ाइलों और फ़ोल्डरों पर, आप उपयोग कर सकते हैं findया विस्तार होगा ही छिपा फ़ाइलों और फ़ोल्डरों, सहित (रूट निर्देशिका), वर्तमान फ़ोल्डर में (मूल dir), और किसी भी अन्य छिपा प्रविष्टियों। dos2unix ** **/.***/.*...
काइल स्ट्रैंड

1
(ध्यान दें कि किसी निर्देशिका पर चलने पर dos2unixकेवल प्रिंट Skipping <dir>, not a regular file.होता है, इसलिए चालू है ..और .सुरक्षित है।) इसके अतिरिक्त, lsग्लोब के साथ संयोजन यह जांचने का एक अच्छा तरीका नहीं है कि ग्लोब का विस्तार कैसे किया जाता है; echoइसके बजाय उपयोग करें : से प्राप्त होने echo **वाले तर्कों को मुद्रित करेगा । dos2unixdos2unix **
काइल स्ट्रैंड

1
धन्यवाद! समझ में आता है! ठीक है, मेरे पास पूरी तरह से गलत विचार था जो **निहित है, और इसका उपयोग echoस्पष्ट करता है।
NS du Toit

7

एक सामान्य उपयोग का मामला एक गिट रिपॉजिटरी के लिए प्रतिबद्ध सभी फाइलों के लिए लाइन एंडिंग को मानकीकृत करता प्रतीत होता है :

git ls-files | xargs dos2unix

ध्यान रखें कि कुछ फ़ाइलों (जैसे *.sln, *.bat) आदि कर रहे हैं केवल विंडोज ऑपरेटिंग सिस्टम पर इस्तेमाल किया और चाहिए रखने केCRLF समाप्त होने के:

git ls-files '*.sln' '*.bat' | xargs unix2dos

यदि आवश्यक हो, का उपयोग करें .gitattributes


6

किसी भी Solaris उपयोगकर्ताओं के लिए (5.10 का उपयोग कर रहा है, नए संस्करणों पर भी लागू हो सकता है, साथ ही साथ अन्य यूनिक्स सिस्टम):

dos2unix फ़ाइल को अधिलेखित करने के लिए डिफ़ॉल्ट नहीं है, यह केवल अपडेट किए गए संस्करण को stdout में प्रिंट करेगा, इसलिए आपको स्रोत और लक्ष्य निर्दिष्ट करना होगा, अर्थात एक ही नाम दो बार:

find . -type f -exec dos2unix {} {} \;

2
for FILE in /var/www/html/files/*
do
 /usr/bin/dos2unix FILE
done

1
ढेर अतिप्रवाह में आपका स्वागत है। यद्यपि आपका समाधान एक वैध समाधान है, लेकिन यह बहुत अच्छा होगा यदि आप इसमें कुछ स्पष्टीकरण जोड़ सकते हैं। आप अपने उत्तर को सही ठहराने के लिए अन्य उत्तरों का संदर्भ लेने पर भी विचार कर सकते हैं। कृपया अधिक जानकारी के लिए कैसे जवाब दें पर एक नज़र है ।
18'18

2

मुझे भी यही समस्या हुई है और यहाँ की पोस्ट्स की बदौलत मैंने इसे हल किया है। मुझे पता था कि मेरे पास लगभग सौ फाइलें हैं और मुझे इसे .js फाइलों के लिए ही चलाने की जरूरत है। find . -type f -name '*.js' -print0 | xargs -0 dos2unix

आपकी मदद के लिए आप सभी को शुक्रिया।


0

मुझे लगता है कि सबसे सरल तरीका है:

dos2unix $(find . -type f)

0

मैंने इसे एक लाख बार देखा है, इसलिए मेरा समाधान है कि इस बैश समारोह को अपने परिवेश में रखें।

.bashrcया .profileजो भी हो

dos2unixd() {
  find $1 -type f -print0 | xargs -0 dos2unix
}

प्रयोग

$ dos2unixd ./somepath

इस तरह आपके पास अभी भी मूल कमांड है dos2unixऔर इसे याद रखना आसान है dos2unixd


-1

यदि कोई उप-निर्देशिका नहीं है, तो आप भी ले सकते हैं

ls | xargs -I {} dos2unix "{}"

4
यदि कोई उपनिर्देशिका नहीं हैं, dos2unix *तो सरल है और वास्तव में इससे अधिक मजबूत होगा। (यह आम तौर पर के आउटपुट को पाइप करने के लिए अनुशंसित नहीं है ls, क्योंकि यह एक स्वरूपण उपकरण है और *प्रोग्रामेटिक उपयोग के लिए अधिक विश्वसनीय है।)
काइल स्ट्रैंड

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