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. यदि आप नाम बदलने का अभियान चला रहे हैं