बैश: वाइल्डकार्ड के साथ मिली फाइलों में एक सामान्य स्ट्रिंग जोड़ना


0

मुझे आश्चर्य हो रहा है कि वाइल्डकार्ड पैटर्न का उपयोग करके पाई जाने वाली फ़ाइलों की एक विस्तृत श्रृंखला का नाम बदलने का एक तरीका है। उदाहरण के लिए, मैं कहता हूं कि मैं उन scpसभी फाइलों को चाहता हूं जो एक निश्चित पैटर्न से मेल खाती हैं, लेकिन एक निश्चित बिंदु पर फ़ाइल नाम के लिए एक स्ट्रिंग संलग्न करें। कुछ इस तरह:

रिमोट:

hello.txt
help.txt
heroes.txt

मैं चाहता हूं:

hello_copy.txt
help_copy.txt
heroes_copy.txt

जाहिर scp user@remote_host:~/he*.txt ./he*_copy.txtहै काम नहीं करता है। मैं सोच रहा था कि क्या यह संभव है, या अगर मुझे हर फ़ाइल को व्यक्तिगत रूप से कॉपी करने की आवश्यकता है।

आदर्श रूप में मैं, एक समाधान है कि पार्टी के दौरान काम करता है के लिए देख रहा हूँ ताकि मैं के साथ एक ही बात कर सकता है mv, cpआदि


मैं शायद फ़ाइलों को एक स्थानीय निर्देशिका में कॉपी कर दूं, mvउन्हें नए नाम के साथ बाहर कर दें।
mpez0

जवाबों:


3

दुर्भाग्य से वाइल्डकार्ड काफी सीमित हैं। लेकिन यह कुछ अतिरिक्त आदेशों के साथ किया जा सकता है। सबसे पहले, आप एक के साथ फ़ाइलों के माध्यम से iterate कर सकते हैं for:

bash$ ls -1
hello.txt
help.txt
heroes.txt
bash$ for f in *; do echo "$f"; done
hello.txt
help.txt
heroes.txt

आप *.txtसिर्फ एक के बजाय एक प्रारंभिक फ़िल्टरिंग भी कर सकते हैं *। कमांड को तोड़ने से फ़ाइलनाम में रिक्त स्थान या विशेष वर्णों को रोकने के लिए चर को उद्धृत करना सुनिश्चित करें।

अब आप एक स्ट्रिंग को दूसरे के साथ बदल सकते हैं sed( बैकस्लैश की आवश्यकता है क्योंकि डॉट का इसके बिना एक विशेष अर्थ है, और डॉलर के संकेत के बाद इसका अर्थ है "स्ट्रिंग का अंत"):

bash$ for f in *; do echo "$f" | sed s/\.txt$/_copy.txt/; done
hello_copy.txt
help_copy.txt
heroes_copy.txt

आप इसे आसानी से कमांड में बदल सकते हैं । उदाहरण के लिए एक mv(चलो पहले देखें कि यह एक अतिरिक्त काम कैसे दिखता है echo):

bash$ for f in *; do echo mv "$f" `echo "$f" | sed s/\.txt$/_copy.txt/`; done
mv hello.txt hello_copy.txt
mv help.txt help_copy.txt
mv heroes.txt heroes_copy.txt

सब कुछ अच्छा लग रहा है तो चलो अब इसे असली के लिए करें:

bash$ for f in *; do mv "$f" `echo "$f" | sed s/\.txt$/_copy.txt/`; done
bash$ ls -1
hello_copy.txt
help_copy.txt
heroes_copy.txt

तुम भी नाम का उपयोग पूर्ववत कर सकते हैं sed s/_copy\.txt$/.txt/:-)


1
आपको ऐसी कमांड डालनी चाहिए जो स्पेस और स्पेशल कैरेक्टर के साथ ना टूटे, बल्कि इसे स्पेशल केस बनाने के बजाय दूसरों के सामने रखे। वेब के आस-पास पहले से ही बहुत सारी टूटी
फूटी पटकथाएँ मौजूद हैं

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