लिनक्स में पुन: फ़ाइलों का नाम बदलें (परिवर्तन एक्सटेंशन)


22

मैं एक निर्देशिका में सभी फ़ाइलों का नाम कैसे बदलूं, पुनरावर्ती रूप से, एक फ़ाइल एक्सटेंशन को दूसरे में बदलकर, हजारों उप-रक्षकों की हजारों फाइलों के लिए? मैं बहुत सारी कमांड देखता हूं जो लगभग वही करता है जो मैं चाहता हूं, लेकिन काफी नहीं।

find . -name "*.andnav" -exec rename .andnav .tile {} \;
syntax error at (eval 1) line 1, near "."

...

rename -nv 's/\.andnav$/\.tile/i' *.andnav
0.png.andnav renamed as 0.png.tile

1
क्या आपके पास डेबियन renameया रेड हैट है rename?
इग्नासियो वाज़क्वेज़-अब्राम्स

@ इग्नासियो: उबंटू = डेबियन?
एंडोलिथ

हां, उबंटू एक डेबियन व्युत्पन्न है।
इग्नासियो वाज़क्वेज़-अब्राम्स

जवाबों:


23

पता लगा लिया

find . -name "*.andnav" -exec rename -v 's/\.andnav$/\.tile/i' {} \;
./0/0.png.andnav renamed as ./0/0.png.tile
./0/1.png.andnav renamed as ./0/1.png.tile
./1/0.png.andnav renamed as ./1/0.png.tile
./1/1.png.andnav renamed as ./1/1.png.tile

बेशक -v हटा दें जब वास्तव में यह कर रहा है, या यह सभी फाइलों को प्रदर्शित करने में समय बर्बाद करेगा


14

कुछ इस तरह:

find . -name '*.andnav' -exec sh -c 'mv "$0" "${0%.andnav}.tile"' {} \;

इसने मेरे लिए सबसे अच्छा काम किया
cwd


4

मैंने पाया कि यह तरीका आसान और पढ़ने में आसान है:

find . -name "*.andnav" | rename "s/\.andnav$/.tile/"

कम से कम उबंटू व्युत्पन्न नाम बदलने के लिए एसटीडीआईएन से फ़ाइलों की एक सूची लेता है यदि कोई भी कमांड लाइन पर नहीं है। और यह आसानी से परीक्षण किया जा सकता है:

find . -name "*.andnav" | rename -vn "s/\.andnav$/.tile/"

जब तक आप सही नहीं हो जाते।


1

फ़ाइलों और निर्देशिकाओं का नाम बदलें 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सुनिश्चित करने के लिए आवश्यक है कि फाइलें उनके संबंधित निर्देशिकाओं के बाद आती हैं, क्योंकि लंबे समय तक पथ एक ही उपसर्ग के साथ छोटे के बाद आते हैं।

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