कैसे फ़ाइल नाम में स्ट्रिंग की जगह कई फ़ाइलों का नाम बदलने के लिए? इस स्ट्रिंग में "#" है


42

https://serverfault.com/questions/70939/how-to-replace-a-text-string-in-multiple-files-in-linux

https://serverfault.com/questions/228733/how-to-rename-multiple-files-by-replacing-word-in-file-name

https://serverfault.com/questions/212153/replace-string-in-files-with-certain-file-extension

https://serverfault.com/questions/33158/searching-a-number-of-files-for-a-string-in-linux

इन उल्लिखित लेखों ने मेरे प्रश्न का उत्तर दिया है। हालांकि उनमें से कोई भी मेरे लिए काम नहीं करता है। मुझे संदेह है क्योंकि मैं जिस स्ट्रिंग को बदलने की कोशिश कर रहा हूं, उसमें एक # है। क्या इसे संबोधित करने का कोई विशेष तरीका है?

मेरे पास ऐसी छवि फ़ाइल है जिसमें साइट के प्रवास के दौरान # U00a9 द्वारा प्रतिस्थापित किया गया था। ये इस तरह दिखते हैं:

Lucky-#U00a9NBC-80x60.jpg
Lucky-#U00a9NBC-125x125.jpg
Lucky-#U00a9NBC-150x150.jpg
Lucky-#U00a9NBC-250x250.jpg
Lucky-#U00a9NBC-282x232.jpg
Lucky-#U00a9NBC-300x150.jpg
Lucky-#U00a9NBC-300x200.jpg
Lucky-#U00a9NBC-300x250.jpg
Lucky-#U00a9NBC-360x240.jpg
Lucky-#U00a9NBC-400x250.jpg
Lucky-#U00a9NBC-430x270.jpg
Lucky-#U00a9NBC-480x240.jpg
Lucky-#U00a9NBC-600x240.jpg
Lucky-#U00a9NBC-600x250.jpg
Lucky-#U00a9NBC.jpg

और मैं इसे कुछ इस तरह बदलना चाहता हूं:

Lucky-safeNBC-80x60.jpg
Lucky-safeNBC-125x125.jpg
Lucky-safeNBC-150x150.jpg
Lucky-safeNBC-250x250.jpg
Lucky-safeNBC-282x232.jpg
Lucky-safeNBC-300x150.jpg
Lucky-safeNBC-300x200.jpg
Lucky-safeNBC-300x250.jpg
Lucky-safeNBC-360x240.jpg
Lucky-safeNBC-400x250.jpg
Lucky-safeNBC-430x270.jpg
Lucky-safeNBC-480x240.jpg
Lucky-safeNBC-600x240.jpg
Lucky-safeNBC-600x250.jpg
Lucky-safeNBC.jpg

अद्यतन करें:

ये सभी उदाहरण "LU00a9ucky से शुरू होते हैं, लेकिन यहां विभिन्न नामों के साथ कई चित्र हैं। मैं बस" सुरक्षित "के साथ बदलने के लिए स्ट्रिंग के" # U00a9 "भाग को लक्षित कर रहा हूं।


3
तो आपने वास्तव में क्या प्रयास किया है? मैं देखता हूं कि आपने कुछ प्रश्नों से जुड़े हैं और कहते हैं कि वे असफल रहे, लेकिन वे कैसे असफल हुए? IMO सबसे अच्छा उदाहरण renameकमांड का उपयोग करता है । मुझे संदेह है कि आपका नाम बदलना उतना ही सरल होगा rename -n 's/#/safeNBC/' *.jpg
ज़ॉडेचेचे

मैंने कोशिश की rename -n 's/#U00a9/safe/' *.jpgऔर कमांड को स्वीकार कर लिया गया लेकिन कोई बदलाव नहीं हुआ।

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

मैं माफी माँगता हूँ मैंने पूरा ध्यान दिए बिना आपके उदाहरण की नकल की और चिपकाया, मैंने बिना नाम के कमांड का नाम दिया। मेरा मानना ​​है कि @DTK समस्या का समाधान करता है, मैं # से बच नहीं रहा था।

MacOS पर फ़ाइल नाम में स्ट्रिंग्स की जगह: superuser.com/questions/152627/…
एंटोन तारासेंको

जवाबों:


64

बदलने के लिए #द्वारा somethingelseवर्तमान निर्देशिका (पुनरावर्ती नहीं) का उपयोग कर सकते में फ़ाइल नामों के लिए जीएनयू नाम बदलने उपयोगिता:

rename  's/#/somethingelse/' *

जैसे चरित्रों के -साथ बच जाना चाहिए \

आपके मामले के लिए, आप उपयोग करना चाहेंगे

rename 's/#U00a9/safe/g' *

ध्यान दें कि यदि आप केवल फाइलों के एक निश्चित चयन पर काम करना चाहते हैं, जैसे, केवल *.jpg, अंतिम इनपुट को उस चयन से मिलान करने के लिए समायोजित करें:

rename 's/#U00a9/safe/g' *.jpg

वास्तव में फ़ाइल नाम बदलने से पहले एक परीक्षण करने के लिए, -nध्वज का उपयोग करें :

demo/> ls                               
Lucky-#U00a9NBC-125x125.jpg  
Lucky-#U00a9NBC-150x150.jpg 

demo/> rename -n 's/#U00a9/safe/g' *.jpg
rename(Lucky-#U00a9NBC-125x125.jpg, Lucky-safeNBC-125x125.jpg)
rename(Lucky-#U00a9NBC-150x150.jpg, Lucky-safeNBC-150x150.jpg)

ओएस एक्स के लिए, जीएनयू नाम बदलने का उपयोग कर स्थापित किया जा सकता homebrew : brew install rename


यह मेरी मशीन (आर्क लिनक्स) पर काम नहीं करता था, लेकिन मिक का जवाब था।
marcvangend

@marcvangend आप किस संस्करण का renameउपयोग कर रहे हैं? # sudo pacman -S perl-renameपर्ल संस्करण को स्थापित करेगा, जो अधिक शक्तिशाली है और आपके लिए यह उत्तर कार्य करने के लिए पर्याप्त हो सकता है।
जॉन गोवर्स

@ जॉनसन धन्यवाद! मुझे महसूस नहीं हुआ कि दो संस्करण हैं। मेरे सिस्टम पर, rename --versionरिटर्न rename from util-linux 2.29.2इतना है कि वास्तव में पर्ल संस्करण नहीं है।
marvvangend

5
दो सामान्य renameउपयोगिताओं हैं, लेकिन उनमें से कोई भी GNU द्वारा विकसित नहीं है: डेबियन-आधारित वितरण में renameउनके पर्ल पैकेज के साथ एक उपयोगिता शामिल है जबकि Red Hat- आधारित वितरण लिनक्स कर्नेल संगठन से renameउपयोगिता का उपयोग करते हैं util-linux। आपका लिंक GNU मानक लाइब्रेरी से renameC फ़ंक्शन के लिए है ।
एंथनी जी -

2
इस जवाब में, हमें क्यों लिखना /gहैrename 's/#U00a9/safe/g' *
निखिल

21

फ़ाइलों की सूची खोजें और फिर कीवर्ड बदलें। नीचे उदाहरण है

find . -name '*jpg' -exec bash -c ' mv $0 ${0/\#U00a9NBC/safeNBC}' {} \;

1
आपको अपने mvतर्कों के आसपास कुछ दोहरे-उद्धरणों की आवश्यकता है, अगर नाम में रिक्त स्थान हैं
रोकें मोनिका

मुझे सभी फ़ाइलों को बदलने की आवश्यकता थी * _spec.rb से * _controller_spec.rb और आपके समाधान ने मेरे लिए काम किया। Thanx।
जेडी

18

यह मुश्किल नहीं है, बस रिवर्स-स्लैश (\) को रोककर नाम में ऑक्टोथोरपे (#) से बचना सुनिश्चित करें।

find . -type f -name 'Lucky-*' | while read FILE ; do
    newfile="$(echo ${FILE} |sed -e 's/\\#U00a9/safe/')" ;
    mv "${FILE}" "${newfile}" ;
done 

आपका स्पष्टीकरण समझ में आता है, #ध्वनियों से बचना जैसे मुझे क्या चाहिए। मैं आपके उदाहरण में एक बैकस्लैश नहीं देखता हूं। क्या यह इस तरह दिखना चाहिए:s/\#U00a9/safe/

@LeonFrancisShelhamer का अच्छा कैच। इसने बैकस्लैश निगल लिया। मैं संशोधित करूंगा।

17

#शेल से बचने के लिए, बस सिंगल कोट्स ( '#'), डबल कोट्स ( "#"), या बैकस्लैश ( \#) का उपयोग करें।

आपके मामले में सबसे सरल renameआदेश का उपयोग करना होगा (यदि यह उपलब्ध है):

rename '#U00a9' safe *.jpg

2
धन्यवाद। जबकि सबसे ज्यादा वोट किए गए जवाब ( rename 's/#/somethingelse/' *) ने मेरी मशीन (आर्क लिनक्स) पर काम नहीं किया, यह एक ने किया।
marcvangend

1
यह उपयोग-लिनेक्स से नाम बदलें कमांड का उपयोग करता है।
imclean

10

सुनिश्चित नहीं है कि कैसे सेड में, लेकिन आप इसे बैश शेल में आज़मा सकते हैं:

for f in Lucky-#U00a9NBC-*.jpg; do mv -v "$f" "${f/#U00a9/safe}"; done;

स्पष्टीकरण:

  1. ग्लोब से मेल खाते सभी नामों के माध्यम से लूप्स (लकी- # U00a9NBC - *। jpg)
  2. नाम बदलें फ़ाइल कमांड (एमवी) का उपयोग कर
  3. नए नाम ("$ {f / # U00a9 / safe}" को तैयार करने के लिए देशी बैश पैरामीटर प्रतिस्थापन $ {var / पैटर्न / प्रतिस्थापन} का उपयोग करता है)

पैरामीटर प्रतिस्थापन पर अधिक (जो कि बहुत कम पहचाना गया IMO है): http://www.tldp.org/LDP/abs/html/parameter-substitution.html


हालांकि यह कोड प्रश्न का उत्तर दे सकता है, यह अपने आप में बहुत उपयोगी नहीं है। यह बताते हुए कि यह समस्या को हल कैसे करता है और उत्तर की उपयोगिता और दीर्घकालिक मूल्य में सुधार करेगा।
एंथनी जी -

एंथोनी की टिप्पणी के अनुसार वॉकथ्रू स्पष्टीकरण और आगे पढ़ना।
ग्रेगरी पटमोर

1

उपरोक्त उदाहरण मेरे सिस्टम (CentOS 5.6) पर काम नहीं कर रहे थे, इसलिए मुझे एक (संभवतः अधिक सिस्टम-विशिष्ट) कमांड मिला जो काम करता है (ध्यान दें: \कमांड लाइन पर '#' से बचने की आवश्यकता है ):

rename \#U00a9 safe *.jpg

[भी: मेरे पास अभी तक टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है, इसलिए निखिल के सवाल के जवाब /gमें rename 's/old_string/new_string/g'(ऊपर एक अन्य उत्तर के लिए टिप्पणियों में प्रस्तुत):

g'वैश्विक' प्रतिस्थापन करने के लिए संशोधक का उपयोग करें (अर्थात, पुराने_स्ट्रीम के लिए new_string को स्थानापन्न करने के लिए जितनी बार old_string होता है)। यह मेरे उत्तर में आवश्यक नहीं होना चाहिए क्योंकि यह renameनिर्दिष्ट सभी फाइलों पर लागू होगा *। इस और अन्य संशोधक के संक्षिप्त विवरण के लिए https://www.computerhope.com/unix/rename.htm देखें ।]


सही बात; फेडोरा-व्युत्पन्न OSes जैसे CentOS में renameडेबियन-व्युत्पन्न OSes की तुलना में एक अलग संस्करण है । Unix.stackexchange.com/a/238862/135943 देखें । और वैसे, CentOS 5.6 काफी पुराना है और मैं आपको अपग्रेड करने की सलाह देता हूं।
वाइल्डकार्ड

आह, स्पष्टीकरण + लिंक के लिए धन्यवाद। पुराना OS काम पर है और इसलिए यह अपग्रेड करने के लिए मेरे पास नहीं है :) लेकिन एक नया क्लस्टर बनाया जा रहा है और संभवत: जब हम आगे बढ़ेंगे तो हम अपग्रेड करेंगे ...
एज्रा सिट्रॉन

0

यहाँ DTK का समाधान पुन: प्रयोज्य बैश फ़ंक्शन में लिपटा हुआ है:

function renameFilesRecursively () {

  SEARCH_PATH="$1"
  SEARCH="$2"
  REPLACE="$3"

  find ${SEARCH_PATH} -type f -name "*${SEARCH}*" | while read FILENAME ; do
      NEW_FILENAME="$(echo ${FILENAME} | sed -e "s/${SEARCH}/${REPLACE}/g")";
      mv "${FILENAME}" "${NEW_FILENAME}";
  done

}

यहां बताया गया है कि आप इसका उपयोग कैसे कर सकते हैं:

renameFilesRecursively /home/user/my-files apple orange

0

वास्तव renameमें एक विकल्प है कि वास्तव में बुलाया --substया -sसंक्षेप में है। रेगेक्स सिंटैक्स का उपयोग करने की आवश्यकता नहीं है।

rename -s '#U00a9' 'safe' *

यदि आप बहु आवृत्तियों को प्रतिस्थापित / प्रतिस्थापित करना चाहते हैं, तो उपयोग करें --subst-allया -S

BTW, मैं केवल कुछ नहीं द्वारा एक स्ट्रिंग को बदलना चाहता था (इसे फ़ाइल नाम से हटाएं) ... अच्छी तरह से हमारे पास इसके लिए एक विकल्प भी है -d/--deleteऔर -D/--delete-all:

rename -d '#U00a9' *

-1

एक अन्य विकल्प का उपयोग करना है pyRenamer, विशेष रूप से बैच के नामकरण के लिए किया गया एक आवेदन।

इसके साथ स्थापित किया जा सकता है sudo apt-get install pyrenamer

उपयोग के विवरण के लिए, GitHub पर इसकी README फ़ाइल देखें ।


1
यदि आप वास्तव में सोचते हैं कि यह प्रश्न का उत्तर दे सकता है तो कृपया अपने उत्तर में कुछ स्पष्टीकरण जोड़ें। अपने आप में, यह केवल एक पैकेज स्थापित करता है। आपको यह बताना चाहिए कि कमांड क्या करता है और एक उदाहरण प्रदान करता है जो ओपी की विशिष्ट आवश्यकता को संभालता है।
रोज़ा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.