find . -depth -name '*[A-Z]*'|sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'|sh
मैंने यहाँ वर्णित अधिक विस्तृत लिपियों की कोशिश नहीं की है, लेकिन मेरे Synology NAS पर मेरे लिए एक भी कमांडलाइन संस्करणों ने काम नहीं किया है। rename
उपलब्ध है, और के रूपांतरों के कई नहीं है find
, क्योंकि यह पहले से ही नाम दिया गया पथ (उदाहरण के पुराने नाम से चिपक यदि यह पाता है लगता है असफल ./FOO
द्वारा पीछा किया ./FOO/BAR
, का नाम बदलने ./FOO
के लिए ./foo
अभी भी सूची के लिए जारी रहेगा./FOO/BAR
, भले ही उस पथ अब मान्य नहीं है) । ऊपर की कमान ने बिना किसी मुद्दे के मेरे लिए काम किया।
निम्नानुसार कमांड के प्रत्येक भाग की व्याख्या है:
find . -depth -name '*[A-Z]*'
यह किसी भी फाइल को करंट डाइरेक्टरी ( .
जो भी डायरेक्टरी आप प्रोसेस करना चाहते हैं उसे बदल सकते हैं), एक डीप-फर्स्ट सर्च (उदाहरण के लिए, यह ./foo/bar
पहले लिस्ट होगी) का उपयोग करके मिलेगा ./foo
, लेकिन केवल उन फाइलों के लिए जिनमें अपरकेस कैरेक्टर होता है। -name
फिल्टर केवल आधार फ़ाइल नाम, नहीं पूरा पथ पर लागू होता है। तो यह सूची होगी ./FOO/BAR
लेकिन नहीं ./FOO/bar
। यह ठीक है, क्योंकि हम नाम नहीं बदलना चाहते हैं ./FOO/bar
। हम ./FOO
हालांकि नाम बदलना चाहते हैं , लेकिन यह बाद में सूचीबद्ध है (यह इसलिए -depth
महत्वपूर्ण है)।
यह कॉमैंड अपने आप में उन फाइलों को खोजने के लिए विशेष रूप से उपयोगी है जिन्हें आप पहली बार में नाम बदलना चाहते हैं। फ़ाइल का नाम बदलने या त्रुटियों के कारण अभी भी प्रतिस्थापित नहीं की गई फ़ाइलों की खोज करने के लिए पूर्ण नाम बदलने के आदेश के बाद इसका उपयोग करें।
sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'
यह भाग find
आउटपुट की गई फ़ाइलों को पढ़ता है और उन्हें mv
एक नियमित अभिव्यक्ति का उपयोग करके कमांड में प्रारूपित करता है । -n
विकल्प बंद हो जाता है sed
इनपुट मुद्रण से, और p
खोज एवं प्रतिस्थापन regex आउटपुट प्रतिस्थापित पाठ में आदेश।
रेगेक्स में ही दो कैद होते हैं: अंतिम / (जो फ़ाइल की निर्देशिका है) तक का हिस्सा है, और फ़ाइल नाम स्वयं। निर्देशिका को बरकरार रखा गया है, लेकिन फ़ाइल नाम को लोअरकेस में बदल दिया गया है। तो, अगर find
आउटपुट ./FOO/BAR
, यह हो जाएगा mv -n -v -T ./FOO/BAR ./FOO/bar
। यह सुनिश्चित करता है कि मौजूदा लोअरकेस फ़ाइलों का -n
विकल्प mv
ओवरराइट नहीं किया गया है। -v
विकल्प बनाता है mv
हर बदलाव है कि यह बनाता है (- अगर या नहीं पड़ता है उत्पादन ./FOO/bar
पहले से मौजूद है, यह की तरह कुछ आउटपुट ./FOO/BAR -> ./FOO/BAR
, यह देखते हुए कि कोई परिवर्तन नहीं किया गया है)। -T
यहाँ बहुत महत्वपूर्ण है - यह एक निर्देशिका के रूप में लक्ष्य फ़ाइल व्यवहार करता है। इससे यह सुनिश्चित हो जाएगा कि अगर उस निर्देशिका का अस्तित्व ./FOO/BAR
नहीं है तो उसे स्थानांतरित नहीं किया जाएगा ./FOO/bar
।
find
इसे निष्पादित करने वाली कमांड की एक सूची उत्पन्न करने के लिए एक साथ उपयोग करें (वास्तव में इसे किए बिना क्या किया जाएगा यह सत्यापित करने के लिए आसान है)
sh
यह बहुत आत्म व्याख्यात्मक है। यह सभी उत्पन्न mv
कमांड को शेल दुभाषिया के लिए रूट करता है । आप इसे bash
अपनी पसंद के किसी भी शेल के साथ बदल सकते हैं।
ABCdef
,abcDEF
औरaBcDeF
? नाम बदलने के लिए गर्भपात करना चाहिए या सिर्फ चेतावनी देना चाहिए और जारी रखना चाहिए? 2. आप गैर यूएस-एएससीआईआई नामों के लिए निचले मामले को कैसे परिभाषित करते हैं? यदि ऐसे नाम मौजूद हो सकते हैं, तो क्या पहले एक चेक और बहिष्कृत पास होना चाहिए? 3. यदि आप नाम बदलने का अभियान चला रहे हैं