फ़ाइलों और निर्देशिकाओं का नाम बदलें find -execdir | rename
यदि आप केवल एक प्रत्यय के साथ फाइल और निर्देशिका दोनों का नाम नहीं बदलने जा रहे हैं, तो यह एक अच्छा पैटर्न है:
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find . -depth -execdir rename 's/findme/replaceme/' '{}' \;
इसके विपरीत, कमांड निष्पादित करने से पहले भयानक -execdirविकल्प cdनिर्देशिका में होता है ।rename-exec
-depth यह सुनिश्चित करना कि नाम बदलने का काम पहले बच्चों पर होता है, और फिर माता-पिता पर, लापता माता-पिता की निर्देशिकाओं की संभावित समस्याओं को रोकने के लिए।
-execdir आवश्यक है क्योंकि नाम गैर-बेसन इनपुट पथों के साथ अच्छी तरह से नहीं चलता है, उदाहरण के लिए निम्न विफल रहता है:
rename 's/findme/replaceme/g' acc/acc
PATHहैकिंग की आवश्यकता है क्योंकि है -execdirएक बहुत कष्टप्रद दोष यह है: findअत्यंत स्वच्छंद जाता है और साथ कुछ भी करने से मना -execdirकरता है, तो आप अपने किसी भी संबंधित पथ है PATHवातावरण चर, जैसे ./node_modules/.bin, साथ में नाकाम रहने के:
खोज: सापेक्ष पथ './node_modules/.bin' को PATH पर्यावरण चर में शामिल किया गया है, जो खोज की -execdir कार्रवाई के साथ संयोजन में असुरक्षित है। कृपया उस प्रविष्टि को $ PATH से हटा दें
इसे भी देखें: /ubuntu/621132/why-use-the-execdir-action-is-insecure-for-directory-which-is-in-the-path/11093781109378
-execdirएक GNU POSIX के लिए एक्सटेंशन ढूंढता है । renameपर्ल आधारित है और renameपैकेज से आता है । उबंटू 18.10 में परीक्षण किया गया।
नाम बदलें समाधान देखें
यदि आपके इनपुट पथ से नहीं आते हैं find, या यदि आपके पास सापेक्ष पथ झुंझलाहट है, तो हम कुछ पर्ल लुकहेड का उपयोग सुरक्षित रूप से निर्देशिकाओं का नाम बदलने के लिए कर सकते हैं:
git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'
मुझे इसके -execdirसाथ एक सुविधाजनक एनालॉग नहीं मिला है xargs: Xargs: निष्पादित करने से पहले फ़ाइल पथ में कार्यशील निर्देशिका बदलें?
यह sort -rसुनिश्चित करने के लिए आवश्यक है कि फाइलें उनके संबंधित निर्देशिकाओं के बाद आती हैं, क्योंकि लंबे समय तक पथ एक ही उपसर्ग के साथ छोटे के बाद आते हैं।
renameया रेड हैट हैrename?