थोक नाम बदलें, उपसर्ग बदलें


53

मैं कई फाइलों के लिए उपसर्ग को कैसे बदल सकता हूं?

मेरे पास बहुत सारी फाइलें हैं

  • TestSRConnectionContext.h
  • TestSRConnectionContext.m

मैं उन सभी को बदलना चाहूंगा

  • CLConnectionContext.h
  • CLConnectionContext.m

यह मैं कैसे करूंगा?

जवाबों:


38
for name in TestSR*
do
    newname=CL"$(echo "$name" | cut -c7-)"
    mv "$name" "$newname"
done

यह इनपुट फ़ाइल नाम से पहले 6 वर्णों को निकालने के लिए bash कमांड प्रतिस्थापन का उपयोग करता है cut, CLपरिणाम के लिए प्रस्तुत करता है, और उस में संग्रहीत करता है $newname। फिर यह पुराने नाम को नए नाम में बदल देता है। यह हर फाइल पर किया जाता है।

cut -c7-निर्दिष्ट करता है कि इनपुट के बाद केवल इंडेक्स 7 के वर्णों को लौटाया जाना चाहिए। 7-इंडेक्स 7 से शुरू होने वाली एक सीमा है जिसका कोई अंत नहीं है; वह है, लाइन के अंत तक।

पहले, मैंने उपयोग किया था cut -b7-, लेकिन -cइसका उपयोग चरित्र संज्ञाओं को संभालने के लिए किया जाना चाहिए जो कि प्रति वर्ण एकाधिक बाइट्स हो सकते हैं, जैसे UTF-8।


Thx, मुझे यह अभी खुद से भी मिला है। उत्तर के रूप में चिह्नित करना। Thx
एरिकटीजे

यह अच्छी तरह से काम करता है, धन्यवाद। क्या आप बता सकते हैं कि -b7- क्या करता है? क्या यह बाइट-लिस्ट का संदर्भ है? ss64.com/bash/cut.html
imjared

@imjared अधिक विवरण के साथ उत्तर अपडेट करें।
mrb

56

मैं कहूंगा कि यह केवल उस renameकमांड का उपयोग करने के लिए सबसे सरल है जो कई लिनक्स वितरण पर आम है। इस कमांड के दो सामान्य संस्करण हैं, इसलिए इसके मैन पेज की जांच करें कि आपके पास कौन सा है:

## rename from Perl (common in Debian systems -- Ubuntu, Mint, ...)
rename 's/^TestSR/CL/' *

## rename from util-linux-ng (common in Fedora systems, Red Hat, CentOS, ...)
rename TestSR CL *

यदि आप एक डेबियन सिस्टम में उपयोग-लिनेक्स-एनजी से संस्करण का उपयोग करना चाहते हैं, तो यह नाम के तहत उपलब्ध है rename.ul


7
एक चेतावनी: renameजंगली में मौजूद कई संस्करण । अपने स्थानीय renameप्रलेखन की जाँच करें कि कैसे तुम्हारा उपयोग करें।
jw013

उर्फ डू को हटाने के लिएrename TestSR '' *
बिसने

हम्म ... rename "\<pre\>" "" *->Unterminated <> operator at (user-supplied code).
फ्लैश थंडर

32

शेल पैरामीटर विस्तार इस तरह के सरल परिवर्तनों के लिए पर्याप्त है। कमांड प्रतिस्थापन अतिरिक्त प्रक्रियाओं को स्पॉन करने की आवश्यकता के कारण कम कुशल है (कमांड प्रतिस्थापन स्वयं और cut/ के लिए sed)।

for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done

स्पष्टीकरण: TestSR*फ़ाइलों को ढूँढता है, CL${f#TestSR}नया नाम होगा। #वसीयत के बाद का सामान फ़ाइल नाम ( f) से प्रतिस्थापित किया जाएगा ।
जो एइफ़र्ट

4

यहाँ एक तरीका है:

ls *.{h,m} | while read a; do n=CL$(echo $a | sed -e 's/^Test//'); mv $a $n; done
  • ls *.{h,m} -> .h या .m एक्सटेंशन के साथ सभी फाइलें खोजें
  • n=CL -> फ़ाइल नाम में एक सीएल उपसर्ग जोड़ें
  • sed -e 's/^Test//' -> फ़ाइल नाम से परीक्षण उपसर्ग को हटाता है
  • mv $a $n -> नाम बदलकर करता है


1

हालांकि, यह उतना कठिन नहीं था, हालांकि मैं।

$ for f in TestSR*.m; do mv $f CL$(echo $f | cut -c7-); done;
$ for f in TestSR*.h; do mv $f CL$(echo $f | cut -c7-); done;

1
यदि यह भविष्य के लिए मदद करता है, तो आपको अपने दो पैटर्न के लिए कमांड को दोहराना नहीं है; आप (उदाहरण के लिए) का उपयोग कर सकते हैं: for f in TestSR*.[mh], for f in TestSR*.{m,h}, for f in TestSR*.m TestSR*.h
mrb

1

यदि आपको कुछ अधिक कठिन चाहिए तो आप ऐसा कर सकते हैं

perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.