CSV फ़ाइल पर आधारित फ़ाइलों (चित्रों) का नाम बदलने के लिए कैसे


11

मेरे पास क्या है और मैं क्या हासिल करना चाहता हूं:

  1. एक फ़ोल्डर में हजारों चित्र हैं।

  2. मेरे पास निम्नलिखित कॉलमों के साथ एक CSV फ़ाइल है:

    A: मूल नाम B: बदला हुआ नाम

    एक विशिष्ट पंक्ति इस तरह दिखती है:

    "original-1.jpg","renamed-1.jpg"  
    "original-2.jpg","renamed-2.jpg"

    मैं उद्धरण हटा सकता हूं, यह कोई समस्या नहीं है।

  3. अब मैं एक ऐप का उपयोग करना चाहता हूं या एक स्क्रिप्ट चलाना चाहता हूं जो कॉलम ए में सभी छवियों की खोज करेगा और उन्हें कॉलम बी (जैसे मूल-1.jpg -> नामांकित-1.jpg) में नाम बदल देगा।

आसपास कुछ उत्तर हैं, जैसे:

http://ubuntuforums.org/showthread.php?t=1069652

http://systembash.com/content/one-line-batch-rename-files-using-csv-input-file-and-awk/

हालाँकि, इसमें कुछ स्क्रिप्टिंग शामिल है और मुझे यकीन नहीं है कि यदि उन सभी स्क्रिप्ट्स केवल उस फ़ोल्डर को प्रभावित करती हैं जहाँ आप स्क्रिप्ट संग्रहीत करते हैं या वे डिस्क पर मौजूद सभी फ़ाइलों का नाम बदल सकते हैं जो कुछ शर्तों को पूरा करती हैं। बेशक, बाद वाले से बचने की जरूरत है।

मैं जो देख रहा हूं वह एक सरल मार्गदर्शिका है कि फ़ाइलों का नाम कैसे बदला जाए और फ़ाइलों के साथ फ़ोल्डर कैसे चुना जाए।

पहले ही, आपका बहुत धन्यवाद।

जवाबों:


13

यह आपके लिए काम करना चाहिए:

sed 's/"//g' files.csv | while IFS=, read orig new; do mv "$orig" "$new"; done 

स्पष्टीकरण:

  • sed 's/"//g' files.csv : उद्धरण निकालें
  • IFS=, : इनपुट को विभाजित करें ,
  • while read orig new; do ... done: यह प्रत्येक इनपुट लाइन को पढ़ेगा, इसे $IFS(यहां अल्पविराम) के मूल्य पर विभाजित करें और 1 फ़ील्ड को $origऔर बाकी के रूप में सहेजें $new
  • mv "$orig" "$new" : यह अनुरोध के अनुसार फ़ाइलों का नाम बदलेगा।

यदि आपकी फ़ाइल में केवल फ़ाइल नाम (जैसे orig.jpg) और कोई पथ (नहीं /home/take2/orig.jpgया समान) हैं, तो ऊपर दी गई कमांड केवल आपकी वर्तमान निर्देशिका में फ़ाइलों को प्रभावित करेगी। तो, आपको एक टर्मिनल खोलने की जरूरत है, cdलक्ष्य निर्देशिका के लिए और इसे वहां चलाने के लिए।

पहले परीक्षण:

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

sed 's/"//g' files.csv | while IFS=, read orig new; do echo mv "$orig" "$new"; done 

महान, यह बेहतर समझाया गया है। :) बस इसे चलाने से पहले जांचने के लिए - मुझे लक्ष्य निर्देशिका में cd करना है और इस लाइन को चलाना है या मुझे उस लाइन को example.sh के रूप में सहेजने की आवश्यकता है और फिर टर्मिनल से "example.sh" चलाएं?
टेक 2

@ take2 आप सीधे लाइन चला सकते हैं। मैंने यह देखने के तरीके के साथ उत्तर को अपडेट किया कि वास्तव में आपकी फ़ाइलों को बदलने के बिना क्या चलाया जाएगा, मैं आपको पहले ऐसा करने की सलाह देता हूं।
टेराडन

अद्भुत, यह काम करता है! बस एक और बात - क्या यह परवाह करता है कि कॉलम के लेबल क्या हैं (वे इस समय "मूल" और "नए" हैं) या यह सिर्फ कॉलम A नामों को कॉलम B नामों में बदल देता है?
15

@ ले 2 क्या लेबल? नहीं, यह सिर्फ पहले अल्पविराम से अलग हुए क्षेत्र को लेता है और दूसरे को इसका नाम देता है। ध्यान दें कि यदि दो से अधिक क्षेत्र हैं, तो वह इसे शेष पंक्ति में बदल देगा। जब तक आपकी इनपुट फ़ाइल वैसी है जैसी आपने पोस्ट की थी, तब तक यह उम्मीद के मुताबिक काम करेगी।
टेराडॉन

Btw। टर्मिनल "एमवी: 'स्टेट' को भी प्रदर्शित नहीं कर सकता: ऐसी कोई फ़ाइल या निर्देशिका नहीं है", हालांकि इसने फ़ाइल का नाम बदल दिया।
take2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.