फ़ाइलों और निर्देशिकाओं का नाम बदलें 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
?