वर्ष का अंत करने के लिए शुरुआत से शुरू करने के लिए बड़े पैमाने पर नामकरण निर्देशिकाएं


11

मैं वर्तमान में कुछ संगीत फ़ोल्डरों के साथ संघर्ष कर रहा हूं। मैंने एक बार पैटर्न का अनुसरण करते हुए उनका नाम तय किया artist - album - year:। मुझे आज एहसास हुआ कि यह एक चतुर चाल नहीं थी और अब मैं अपनी निर्देशिकाओं का नाम पैटर्न के अनुसार रखना चाहता हूं: year - artist - albumक्योंकि वे तब सूचीबद्ध रूप में आरोही क्रम में दिखाई देंगे।

मैंने हाथ से नाम बदलना शुरू कर दिया लेकिन, लगभग 700 फ़ोल्डरों के साथ, एक सरल तरीका होना चाहिए; मैं का उपयोग करने की कोशिश की, gprenameलेकिन मैं regex और bash पटकथा पर इतना अच्छा नहीं हूँ ...

क्या कोई ऐसा है जो मेरी खराब उंगलियों को छोड़ने में मेरी मदद कर सकता है?

कुछ उदाहरण:

Aes Dana - Memory Shell - 2004 
Anja Schneider & GummiHz - Back To Back (Remixes Part 2) - 2009

बन जाएगा

2004 - Aes Dana - Memory Shell
2009 - Anja Schneider & GummiHz - Back To Back (Remixes Part 2)

EDIT: कुछ कलाकार और एल्बम नामों में विशेष वर्ण होते हैं जैसे And.Idया Kool & The Gang। हालांकि हर निर्देशिका -में विभाजक होता है।


1
आप जानते हैं कि प्रश्न को कैसे संपादित किया जाए, इसलिए आप इसे प्रश्न में क्यों नहीं जोड़ते? इसके अलावा, क्या -उनमें से किसी एल्बम या कलाकार के नाम हैं ?
मुरु

क्या नाम "परिभाषा द्वारा परिसीमन" है, और क्या यह संभवतः नाम में कहीं और होता है?
जैकब व्लिजम

मैं एक पाठ फ़ाइल पर पुनर्निर्देशित करने वाले स्रोत फ़ोल्डर को एलएस करता हूं, फिर विम का उपयोग करें। मैं सही क्रम में स्रोत फ़ोल्डर के प्रासंगिक घटकों के साथ प्रत्येक पंक्ति के लिए एक दूसरा पैरामीटर बनाने के लिए एक मैक्रो बनाता हूं, फिर प्रत्येक पंक्ति की शुरुआत में एमवी लगाने के लिए एक और मैक्रो का उपयोग करें। मैं पहले से ही फ़ोल्डर संरचना की एक प्रति लेने के लिए इतनी दूर जा सकता हूं, जब मैंने / खोए गए फ़ोल्डर की गड़बड़ी की थी।

जवाबों:


16

यह मानते हुए कि आपके पास पर्ल तक पहुंच है rename(आमतौर पर उबंटू में उपलब्ध है - अंतर स्पष्ट करने के लिए @Serg के लिए धन्यवाद। यदि संदेह है, तो कॉल करें /usr/bin/renameऔर आपको सही मिलना चाहिए), आप उपयोग कर सकते हैं:

rename -n 's/(.*) - (\d{4})\//$2 - $1/' */

-nवास्तव में निर्देशिकाओं का नाम बदलने के परीक्षण के बाद निकालें । यह 1000 और 9999 के बीच सभी एल्बमों की तारीख मानता है। संभवतः उचित ...

व्याख्या

  • s/old/newके oldसाथ बदलेंnew
  • (.*)$1बाद में संदर्भ के लिए किसी भी वर्ण के किसी भी संख्या को सहेजें
  • (\d{4})\/$2बाद में संदर्भ के लिए लाइन के अंत में चार अंक बचाएं ।
  • */ सभी निर्देशिकाओं को मिलाएं (फाइलों में नहीं - मदद के लिए @ muru का धन्यवाद!)

3
शायद */केवल निर्देशिकाओं से मेल खाते हैं।
मारू

@ मूरू यह काम करने के लिए नहीं लगता है! मैं क्या बेवकूफी कर रहा हूँ?
ज़ना

1
@Zanna मैं पतली हूँ जो वे संदर्भित करते हैं, यह तथ्य है कि कुछ गोले जैसे mkshएक निर्मित में हैं rename। यह पूर्ण पथ के साथ इसे बदलने के लिए या prenameपर्ल नाम बदलने के लिए कॉल करने के लिए पर्याप्त है
सर्गी कोलोडियाज़नी

1
@Zanna को यह दिलचस्प सा मिला: unix.stackexchange.com/a/229248/85039 TL; DR : rename"इसे कभी-कभी" नहीं कहा जाता है, prenameलेकिन जाहिर है कि वे एक ही स्क्रिप्ट की दो "शाखाएं" हैं, एक जिसे बनाए नहीं रखा जाता है डेबियन द्वारा, और दूसरा जो है। तो हाँ । । । यह पूरी तरह से गड़बड़ है - कुछ गोले अपने स्वयं के हैं rename, पर्ल पैकेज का अपना है rename, और डेबियन खुद को अलग पैकेज प्रदान करता है
सर्गी कोलोडियाज़नी

1
@Zanna मैं उस कार्यक्रम के बारे में सोच रहा था जिसे unix.stackexchange.com/q/229230/21167rename.ul
zwol

6

सरल पायथन लिपि ऐसा काम कर सकती है:

$ tree
.
├── Aes Dana - Memory Shell - 2004
├── Anja Schneider & GummiHz - Back To Back (Remixes Part 2) - 2009
└── rename_dirs.py

2 directories, 1 file
$ ./rename_dirs.py */
$ tree
.
├── 2004 - Aes Dana  -  Memory Shell 
├── 2009 - Anja Schneider & GummiHz  -  Back To Back (Remixes Part 2) 
└── rename_dirs.py

स्क्रिप्ट सामग्री:

#!/usr/bin/env python
from shutil import move;
import sys

for i in sys.argv[1:] :
    parts = i[:-1].split('-')
    year = parts[-1].strip()
    new_name = year + " - " + " - ".join(parts[:-1]).strip()
    move(i,new_name)

यह कैसे काम करता है:

  • मुख्य चाल यह है कि हम उसी निर्देशिका से स्क्रिप्ट निष्पादित करते हैं जहां लक्ष्य रहते हैं। हम */स्क्रिप्ट को तर्क के रूप में केवल निर्देशिका प्रदान करने के लिए भी पास होते हैं
  • पटकथा सभी कमांड-लाइन तर्कों पर आधारित होती है, प्रत्येक फ़ाइलनाम को -चरित्र पर तार की सूची में तोड़ती है । नए फ़ाइलनाम का निर्माण हमारे द्वारा निकाले गए भागों से किया जाता है।
  • move()shutilsमॉड्यूल से फ़ंक्शन वास्तव में निर्देशिकाओं का नाम बदल देता है

उपयोग पर ध्यान दें: ./rename_dirs.py */

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