एक त्वरित तरीके से विशेष संरचना के साथ फ़ाइलों का नाम बदलना


0

मैंने यहाँ समाधान की जाँच की , लेकिन यह मेरी समस्या को बहुत अच्छी तरह से स्वीकार नहीं कर रहा है, क्योंकि यह मेरे नामकरण की विशिष्ट संरचना का उपयोग नहीं करता है।

उदाहरण के लिए, मेरे पास फाइलों का एक संग्रह है, जो एक व्यवस्थित तरीके से नामांकित और नामांकित है

filep-x

जहाँ x एक संख्या है जो काफी बड़ी हो सकती है और p "makrocollection" के लिए एक मार्कर है। मैं इस तरह के makrocollection में सभी फाइलों को एक टेम्पलेट के रूप में कॉपी करना चाहता हूं और स्वचालित रूप से कॉपी की गई सभी फ़ाइलों का नाम बदल सकता हूं

fileq-x

दूसरे शब्दों के साथ, क्या कोई विकल्प है कि मैं अतिरिक्त दस्तावेजों के साथ काम किए बिना (जैसे कई संपादकों में संभव है) टर्मिनल का उपयोग करके नामों को स्वचालित रूप से बदल सकता है?

आपका अग्रिम में ही बहुत धन्यवाद!

जवाबों:


2

यह एक काम हो सकता है pax, यह मानते हुए कि एक निरंतर नामकरण सम्मेलन है।

cd directory

pax -rws/filep/fileq/ filep-* /path/to/copy/directory

1

आमतौर पर यह एक bashलूप के साथ किया जा सकता है - सबसे तेज नहीं, बल्कि सरल। टर्मिनल प्रकार में:

for f in filep-* ; do mv -iv "$f" "$(echo "$f" | sed 's/p/q/')" ; done

स्पष्टीकरण:

  • for f in filep-* ; do -> बुलाया सभी फ़ाइलों के filep-anythingलिए, निम्न कार्य करें
  • mv -iv A Bचाल (= नाम बदलें) ए से बी, यह बताते हुए कि आप क्या करते हैं -vऔर मौजूदा फ़ाइल को अधिलेखित करने से पहले पुष्टि के लिए पूछते हैं-i
  • एक फ़ाइल को स्थानांतरित करने जा रहे थे "$f"(फ़ाइल नामों में स्थान के साथ समस्याओं के समाधान के लिए उद्धरण):
  • $( $echo $f | sed 's/A/B' )फ़ाइल नाम मुद्रित तो का उपयोग sedकरने के लिए sपहली बार (! और पहले केवल) की घटना ubstitute Aसाथ B(यह भी हो सकता है sed 's/this123/that456/', लेकिन जानते हैं कि यह पहली हिट से मिलान करेगा होना)

यह सुनिश्चित करने के लिए कि यह अपेक्षित व्यवहार करता है, इसे पहले चलाएं:

for f in filep-* ; do echo mv -iv "$f" "$(echo "$f" | sed 's/p/q/')" ; done

यह बस प्रत्येक फ़ाइल के लिए निष्पादित होने वाली कमांड को प्रिंट करेगा और जैसा दिखना चाहिए mv -i filep-x fileq-x

नोट: यह फ़ाइलों का नाम बदलने के लिए है और इस प्रकार आपके द्वारा उन्हें कॉपी करने के बाद। यह एक में नकल और नाम बदलने का काम नहीं करता है। इसके अलावा इसका अर्थ उस निर्देशिका को निष्पादित करना है जहां फाइलें हैं।


मैं मान रहा हूं कि आपने वास्तव में अपने कोड का परीक्षण नहीं किया था, क्योंकि for ... in ... doneकमांड, जैसा कि लिखा गया है, संभवतः ठीक से निष्पादित नहीं कर सकता है क्योंकि आपने संदर्भित किया है "$file"लेकिन इसे असाइन नहीं किया है! यह "$f"नहीं होना चाहिए "$file"। इसके अलावा, आप ऐसी फ़ाइल को स्थानांतरित करने का प्रयास कर रहे हैं जो मौजूद नहीं है क्योंकि for f in fileq-*माना जाता है for f in filep-*। मौजूदा फाइलें ओपी में पहले pनहीं हैं और नाम बदलने के हिस्से के रूप में माना जाता है । अगर मैं उसके बारे में गलत हूं, तो आपकी आज्ञा गलत होगी। q-qsed
user3439894

@ user3439894 - सुधार के लिए धन्यवाद। मैंने कोड का परीक्षण किया, फिर भी अलग-अलग चर का उपयोग किया, इसलिए मिक्स-अप के बीच fileq-और filep-साथ ही बीच $fileऔर $f(यह मेरी bashस्क्रिप्ट के आधे हिस्से में होता है ... एक बुरी आदत है)। - अपडेट किया गया।
फिक्समैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.