2008-09-23 10 views
46

फ़ाइल समाप्त होने वाली लाइन को निर्धारित करने के लिए कैसे करें मेरे पास एक गुच्छा (सैकड़ों) फ़ाइलें हैं जिन्हें यूनिक्स लाइन एंडिंग माना जाता है। मुझे दृढ़ता से संदेह है कि उनमें से कुछ में विंडोज लाइन के अंत हैं, और मैं प्रोग्रामेटिक रूप से यह जानना चाहता हूं कि कौन से लोग करते हैं।फ़ाइल

मुझे पता है कि मैं बस

flip -u
या सबकुछ बदलने के लिए एक स्क्रिप्ट में समान कुछ चला सकता हूं, लेकिन मैं उन फ़ाइलों को पहचानने में सक्षम होना चाहता हूं जिन्हें पहले बदलने की आवश्यकता है।

उत्तर

28

आप ग्रेप की तर्ज पर

egrep -l $'\r'\$ * 
+0

में भी वर्णित है बस ध्यान दें: उपरोक्त आदेश को बैश से चलाने की आवश्यकता है। किसी कारण से – tzot

+3

, जब मैं मैकोज़ एक्स शैल में यह आदेश चलाता हूं, तो मुझे निर्देशिका में सभी फ़ाइलों की एक सूची मिलती है। यहां तक ​​कि एक जिसे मैं "echo" test "> torderform6.cpp" के साथ उत्पन्न करता हूं। कोई विचार क्या गलत हो सकता है? –

+7

यह सिर्फ उबंटू पर मेरे लिए फ़ोल्डर में सभी फाइलों को सूचीबद्ध करता है। – rjmunro

0

विंडोज़ लाइन 13 के लिए चार 13 & 10 का उपयोग करते हैं, उनमें से केवल एक यूनिक्स (मुझे याद नहीं है)। तो आप चार 13 या 10 (एक, जो यूनिक्स का उपयोग करते हैं) के लिए char 13 & 10 को प्रतिस्थापित कर सकते हैं।

64

आप file उपकरण का उपयोग कर सकते हैं, जो आपको लाइन के अंत प्रकार के बारे में बताएगा। या, आप केवल dos2unix -U का उपयोग कर सकते हैं जो कि सब कुछ के साथ शुरू होने के बावजूद यूनिक्स लाइन एंडिंग में सबकुछ बदल देगा।

+4

फ़ाइल लाइन समाप्त नहीं दिखाती है। पूर्व। : "फाइल .bashrc => .bashrc: ASCII अंग्रेजी पाठ" कुछ अतिरिक्त कुंजी की आवश्यकता है? –

+7

@ फेडर: हाँ, ऐसा करता है, यह सिर्फ इसलिए है कि फ़ाइल में नियमित रूप से एलएफ लाइन समाप्ति होती है, तो यह किसी आउटपुट को प्रिंट नहीं करेगा।लेकिन अगर फ़ाइल में सीआरएलएफ, नंगे सीआर, या मिश्रित रेखा के अंत हैं, तो यह आपको बताएगा। –

+2

ओएस एक्स पर एक सीआरएलएफ-केवल पर्ल स्क्रिप्ट पर मेरे लिए काम नहीं किया। क्या एक जीएनयू एक्सटेंशन हो सकता है? –

3

यूनिक्स एक बाइट, 0x0A (लाइनफिड) का उपयोग करता है, जबकि विंडोज दो बाइट्स, 0x0D 0x0A (कैरिज रिटर्न, लाइन फीड) का उपयोग करता है।

यदि आप कभी भी 0x0D नहीं देखते हैं, तो यह यूनिक्स की संभावना है। यदि आप 0x0D 0x0A जोड़े देखते हैं तो यह एमएसडीओएस की संभावना है।

14

कुछ इस्तेमाल कर सकते हैं:

perl -p -e 's[\r\n][WIN\n]; s[(?<!WIN)\n][UNIX\n]; s[\r][MAC\n];' FILENAME 

कि हालांकि regexp के कुछ शोधन और साफ़ कर रही पड़ सकता है।

यह आपकी फ़ाइल को प्रत्येक पंक्ति के अंत में WIN, MAC, या यूनिक्स के साथ आउटपुट करेगा। अच्छा अगर आपकी फ़ाइल किसी भी तरह से एक डरावना गड़बड़ (या एक diff) है और मिश्रित अंत है।

+0

उबंटू पर मेरे लिए काम किया, स्वीकार्य उत्तर सिर्फ सभी फाइलों को सूचीबद्ध करता है –

+0

मेरे लिए काम नहीं करता है, देता है: रेगेक्स में 'बेजोड़); द्वारा चिह्नित किया गया है <- यहां एम/(? <! जीत) <- यहां \ n/at -e लाइन 1.' – moshen

+0

आपको < को '<' – Joseph

0

जब आप जानते हैं कि कौन सी फाइलें विंडोज लाइन एंडिंग्स (0x0D 0x0A या \r \n) हैं, तो आप उन फ़ाइलों के साथ क्या करेंगे? मुझे लगता है, आप उन्हें यूनिक्स लाइन सिरों में बदल देंगे (0x0A या \n)। आप sed उपयोगिता के साथ यूनिक्स लाइन अंत में विंडोज लाइन अंत के साथ फ़ाइल में बदल सकते हैं, आदेश सिर्फ का उपयोग करें:

$> sed -i 's/\r//' my_file_with_win_line_endings.txt 

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

#!/bin/bash 

function travers() 
{ 
    for file in $(ls); do 
     if [ -f "${file}" ]; then 
      sed -i 's/\r//' "${file}" 
     elif [ -d "${file}" ]; then 
      cd "${file}" 
      travers 
      cd .. 
     fi 
    done 
} 

travers 

आप अपनी जड़ से यह चलाते हैं फाइलों के साथ डीआईआर, अंत में आप सुनिश्चित होंगे कि सभी फाइल यूनिक्स लाइन एंडिंग के साथ हैं।

4

यहां सबसे असफल जवाब है। Stimms उपनिर्देशिका और बाइनरी फ़ाइलें

find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }' 
  • उपयोग file फ़ाइल प्रकार खोजने के लिए नहीं करता खाते जवाब। सीआरएलएफ वाले लोगों के पास विंडोज़ रिटर्न कैरेक्टर हैं। file का आउटपुट : द्वारा सीमित है, और पहला फ़ील्ड फ़ाइल का पथ है।
+0

दरअसल सबसे असफल तरीका। केवल सभी पाए गए फ़ाइलों को कनवर्ट करने के लिए बस 'ढूंढें' चलाएं। -टेप f -exec फ़ाइल {} \; | grep "सीआरएलएफ" | awk -F ':' '{प्रिंट $ 1}' | बाद में xargs फ्लिप -ub'। – pixelbrackets

+2

अधिकांश असफलता यह नहीं है - 'फ़ाइल' हमेशा अपने आउटपुट में "सीआरएलएफ" नहीं बताती है, जो इस बात पर निर्भर करती है कि यह किस प्रकार की फाइल है। मैंने पाया है कि एसवीजी फाइलों के लिए - सादे टेक्स्ट फ़ाइलों की तरह टेक्स्ट युक्त - 'फाइल' का उपयोग करने वाली लाइन की तरह का उल्लेख नहीं है। इस प्रकार इस स्क्रिप्ट फ़ाइल प्रकार अज्ञेयवादी नहीं है। बस केह रहा हू। अन्यथा एक साधु एक-लाइनर की तरह दिखता है, उपरोक्त सीमा गैर-सामना करना पड़ता है। – amn