BOM के साथ UTF-8 फ़ाइलों की खोज करने का सुरुचिपूर्ण तरीका?


94

डीबगिंग उद्देश्यों के लिए, मुझे उन सभी फ़ाइलों के लिए एक निर्देशिका को पुन: खोज करने की आवश्यकता है जो UTF-8 बाइट ऑर्डर मार्क (BOM) से शुरू होती हैं। मेरा वर्तमान समाधान एक सरल शेल स्क्रिप्ट है:

find -type f |
while read file
do
    if [ "`head -c 3 -- "$file"`" == $'\xef\xbb\xbf' ]
    then
        echo "found BOM in: $file"
    fi
done

या, यदि आप लघु, अपठनीय वन-लाइनर्स पसंद करते हैं:

find -type f|while read file;do [ "`head -c3 -- "$file"`" == $'\xef\xbb\xbf' ] && echo "found BOM in: $file";done

यह फ़ाइल नाम के साथ काम नहीं करता है जिसमें एक लाइन ब्रेक होता है, लेकिन ऐसी फ़ाइलों की वैसे भी उम्मीद नहीं की जाती है।

क्या कोई छोटा या अधिक सुरुचिपूर्ण समाधान है?

क्या पाठ संपादकों के लिए कोई दिलचस्प टेक्स्ट एडिटर या मैक्रोज़ हैं?

जवाबों:


166

इस एक साधारण आदेश के बारे में क्या जो न केवल पाया जाता है, बल्कि गंदा बीओएम को साफ करता है? :)

find . -type f -exec sed '1s/^\xEF\xBB\xBF//' -i {} \;

मुझे "ढूंढना" पसंद है :)

चेतावनी उपरोक्त बाइनरी फ़ाइलों को संशोधित करेगा जिसमें वे तीन वर्ण हैं।

यदि आप BOM फ़ाइलें दिखाना चाहते हैं, तो इसका उपयोग करें:

grep -rl $'\xEF\xBB\xBF' .

9
गलत तरीके से एक बीओएम मार्कर के साथ पीडीएफ का पता लगाता है .. ऐसा इसलिए है क्योंकि यह पूरे दस्तावेज़ को खोजता है, न कि केवल पहली पंक्ति
ओलिवियर रिफ्लो

1
या पावती के साथ: "पावती '\ XEF \ xbb \ xBF'"
Smar

5
प्रमुख कमांड से पहले 1 जोड़ने के लिए sed कमांड को बदलें, इसलिए यह केवल पहली पंक्ति पर लागू होता है
बेन कॉम्बी

27
grep -rlI $'\xEF\xBB\xBF' .बाइनरी फ़ाइलों को अनदेखा करने के लिए उपयोग करें ।
20

1
जेपीजी और अन्य बाइनरी फ़ाइलों का पता लगाता है और उन्हें संशोधित करता है, जैसा कि पहले ही कहा गया है।
जेहि

41

विंडोज पर ऐसा करने का सबसे अच्छा और आसान तरीका:

टोटल कमांडर → प्रोजेक्ट की रूट dir → फाइल्स ( Alt+ F7) → फाइल टाइप्स * खोजें। * → टेक्स्ट खोजें "EF BB BF" → चेक 'हेक्स' चेकबॉक्स → खोजें

और आप सूची प्राप्त करें :)


4
अच्छा, विशेष रूप से मेरे लंबे समय के पसंदीदा कुल कमांडर का उपयोग, लेकिन दुर्भाग्य से यह एक ही मुद्दे को कई अन्य लोगों के रूप में पीड़ित करता है: यह एक मक्खी में सभी बाइट्स की खोज करता है, इसलिए कई छवियों आदि की सूचना दी जाती है। यह हेक्स के बजाय RegEx का उपयोग करके और "^ \ xEF \ xBB \ xBF" की खोज करके थोड़ा सुधार किया जा सकता है जो कई छवियों को समाप्त कर देगा, लेकिन अभी भी ऐसी फाइलें हैं जो फ़ाइल के माध्यम से आधे रास्ते में हैं (हालांकि कुछ होना चाहिए) और निश्चित रूप से किसी भी द्विआधारी फ़ाइलें जो एक असिसी newline चारकोल है बस बीओएम से परे है। फिर भी, सभी चित्र मेरी परीक्षण खोज में गए थे।
लेगोलस

13
find . -type f -print0 | xargs -0r awk '
    /^\xEF\xBB\xBF/ {print FILENAME}
    {nextfile}'

ऊपर दिए गए अधिकांश समाधान फ़ाइल की पहली पंक्ति की तुलना में अधिक परीक्षण करते हैं, भले ही कुछ (जैसे मार्कस का समाधान) फिर परिणामों को फ़िल्टर करें। यह समाधान केवल प्रत्येक फ़ाइल की पहली पंक्ति का परीक्षण करता है इसलिए इसे थोड़ा तेज होना चाहिए।


1
गॉट लिनक्स (आरएचईएल 6) पर निम्नलिखित के साथ काम कर रहा है -find . -type f -print0 | xargs -0 awk '/^\xEF\xBB\xBF/ {print FILENAME} {nextfile}'
ओलिवियर रिफ्लो

इन फ़ाइलों को ढूंढने के बाद मुझे आपके कोड को कैसे संशोधित करना होगा?
ब्लैक

7

यदि आप कुछ झूठी सकारात्मक स्वीकार करते हैं (यदि कोई गैर-पाठ फ़ाइलें हैं, या असंभावित स्थिति में फ़ाइल के बीच में ZWNBSP है), तो आप grep का उपयोग कर सकते हैं:

fgrep -rl `echo -ne '\xef\xbb\xbf'` .

5

मैं कुछ इस तरह का उपयोग करेंगे:

grep -orHbm1 "^`echo -ne '\xef\xbb\xbf'`" . | sed '/:0:/!d;s/:0:.*//'

जो यह सुनिश्चित करेगा कि BOM फ़ाइल के पहले बाइट पर शुरू होता है।


5

आप grepउन्हें खोजने के लिए उपयोग कर सकते हैं और पर्ल को उन्हें इस तरह बाहर निकाल सकते हैं:

grep -rl $'\xEF\xBB\xBF' . | xargs perl -i -pe 's{\xEF\xBB\xBF}{}'

इसने मेरे लिए काम किया, स्वीकृत उत्तर नहीं आया (मैं मैक पर हूं)
mjsarfatti

4

एक विंडोज़ प्रयोक्ता के लिए, देखें इस (खोजने के लिए अच्छा PHP स्क्रिप्ट BOMअपनी परियोजना में)।


लिंक की गई वेबसाइट से पता चलता है: "वेबसाइट ऑफ़लाइन, कोई कैश्ड संस्करण उपलब्ध नहीं है"।
वोग

समान स्क्रिप्ट github में भी उपलब्ध है: github.com/emrahgunduz/BomCleaner
emrahgunduz

धन्यवाद दोस्त, आपके जवाब ने मेरा दिन बचा लिया।
क्रुणाल पांचाल

और एक बीओएम खोजक: github.com/svn2github/wikia/blob/master/extensions/FCKeditor/… (यदि कोई व्यक्ति 'स्वचालित' सफाई पसंद नहीं करता है, या बस बीओएम की फाइलें खोजना चाहता है)
मेलोनीक

3

इसका एक ओवरकिल समाधान है phptags( viसमान नाम वाला टूल नहीं ), जो विशेष रूप से PHP लिपियों के लिए दिखता है:

phptags --warn ./

उत्पादन कुछ इस तरह होगा:

./invalid.php: TRAILING whitespace ("?>\n")
./invalid.php: UTF-8 BOM alone ("\xEF\xBB\xBF")

और --whitespaceमोड स्वचालित रूप से ऐसे मुद्दों को ठीक करेगा (पुनरावर्ती, लेकिन यह दावा करता है कि यह केवल .php स्क्रिप्ट को फिर से लिखता है)।


2
find -type f -print0 | xargs -0 grep -l `printf '^\xef\xbb\xbf'` | sed 's/^/found BOM in: /'
  • find -print0 नई लाइनों का उपयोग करने के बजाय प्रत्येक फ़ाइल नाम के बीच एक शून्य \ 0 डालता है
  • xargs -0 अलग लाइन के बजाय अशक्त अलग तर्क की अपेक्षा करता है
  • grep -l उन फ़ाइलों को सूचीबद्ध करता है जो रेगेक्स से मेल खाती हैं
  • रेगेक्स ^\xeff\xbb\xbfपूरी तरह से सही नहीं है, क्योंकि यह गैर-बोम्ड UTF-8 फाइलों से मेल खाएगा यदि उनके पास एक लाइन के शुरू में शून्य चौड़ाई रिक्त स्थान है

आपको अभी भी grep से पहले पाइप में "हेड 1" की जरूरत है
MSalters

2

मैंने इसका उपयोग केवल जावास्क्रिप्ट फ़ाइलों को सही करने के लिए किया है:

find . -iname *.js -type f -exec sed 's/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;

0

यदि आप UTF फाइलों की तलाश में हैं, तो फाइल कमांड काम करती है। यह आपको बताएगा कि फाइल की एन्कोडिंग क्या है। अगर वहाँ कोई गैर ASCII वर्ण हैं तो यह UTF के साथ आएगा।

file *.php | grep UTF

हालांकि यह पुनरावर्ती कार्य नहीं करेगा। आप शायद इसे पुनरावर्ती बनाने के लिए कुछ फैंसी कमांड को रिग कर सकते हैं, लेकिन मैंने निम्नलिखित स्तर की तरह प्रत्येक स्तर को व्यक्तिगत रूप से खोजा, जब तक कि मैं स्तरों से बाहर नहीं भाग गया।

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