टर्मिनल के साथ फाइलनाम से सभी कॉलोनों को बदलें


12

मेरे पास HDD पर एक GB का संगीत है जो EXT4 के साथ स्वरूपित था। मैं इन फ़ाइलों को एक FAT स्वरूपित HDD विभाजन में ले जाना चाहता हूं। हालाँकि, मैं अपनी अधिकांश फ़ाइलों को स्थानांतरित नहीं कर सकता क्योंकि उनके पास नामों में ":" है (उदाहरण के लिए, ओपेरा के लिए "अधिनियम 2: .....")। क्या "XXXX: XXXX" से "XXXX-XXXX" तक मेरी सभी फ़ाइलों का नाम बदलने के लिए कमांड लाइन के साथ एक तरीका है?

जवाबों:


25

यदि आपकी सभी फाइलें एकल निर्देशिका में हैं, तो प्रयास करें:

rename 's|:|-|g' *

(जहाँ * यदि आप चाहें तो कुछ और प्रतिबंधों में बदला जा सकता है)

यदि आपके पास डायरेक्टरी ट्री में कई फाइलें हैं, तो ट्री के बेस से यह कोशिश करें:

find . -name "*:*" -exec rename 's|:|-|g' {} \;

आप विकल्प को -nसही से जोड़ने के बाद renameयह बता सकते हैं कि यह क्या कर सकता है बिना कार्य कर रहा है। यह आपको अन्य फ़ाइलों या किसी और चीज़ पर गलती से कदम रखने से बचने में मदद कर सकता है ...


1
सिंगल डायरेक्टरी सॉल्यूशन काम करेगा लेकिन नेस्टेड सॉल्यूशन नहीं होगा अगर डायरेक्ट्रीज़ के पास खुद के नाम हैं। ऐसा इसलिए है क्योंकि find .एक उपनिर्देशिका के नाम के आउटपुट में इसकी सामग्री पहले से है। इसलिए यदि आपके पास /1:/2:पहले फाइल है तो /1:/उसका नाम बदल दिया जाएगा /1-/। अब आप नाम नहीं बदल सकते /1:/2:करने के लिए /1-/2-क्योंकि /1:/2:मौजूद नहीं है।
एस प्रशांत

1
निर्देशिकाओं के लिए: find . -type d -readable -writable -exec rename 's|:|-|g' {} \;और फिर फाइलें:find . -type f -readable -writable -exec rename 's|:|-|g' {} \;

@Christopher निर्देशिकाओं के लिए कमांड विफल हो जाएगी अगर उनके नाम में निर्देशिकाओं के दो स्तर हैं: जैसे: / १: / २: / जहाँ २: भी एक निर्देशिका है। बेशक, अगर रयान की स्थिति में ऐसा नहीं है, तो यह काम करेगा।
एस प्रशांत

उप-डायर के कई स्तरों के लिए उपयोग करें for i in {1..20}; do find . -maxdepth $i -mindepth $i -name "*:*" -exec rename 's|:|-|g' {} \;; done:। डायर की अधिकतम गहराई में 20 बदलें। संरचना। सटीक होना जरूरी नहीं है - बड़ा हो सकता है। हालांकि बहुत बड़ी संख्या में सेट होने में समय लगेगा।
एस प्रशांत

0

Im अभी मेरे linux मशीन पर नहीं है इसलिए मैं केवल किसी न किसी जानकारी दे सकता हूँ।

लिनक्स में एक कमांडलाइन यूटिलिटी होती है, renameजो अन्य इनपुट्स, रेगुलर एक्सप्रेशन या रीजैक्स के साथ काम करती है। आप उस फ़ाइल का उपयोग करने में सक्षम होना चाहिए जैसे अपनी फ़ाइलों का "s /: / - /" जैसे नाम बदलना चाहते हैं।

बस सुरक्षित होने के लिए, इसे छोटे बैचों में करें और / या सिमुलेशन के साथ पहला परीक्षण करें (नाम में एक ध्वज है, जो आपको केवल फ़ाइल का पुराना नाम और नया नाम देता है, वास्तव में नाम बदले बिना - पहले सत्यापित करने के लिए इसका उपयोग करें)


0

यह अजगर में एक समाधान है जो मामले को संभालता है जहां फाइलें आवश्यक रूप से एक ही निर्देशिका में नहीं होती हैं।

import os
torename = []
rootdir = "The main directory"
logfile = "Path to log file" #Eg: logfile = "/home/prasanth/renamelog"
for (path, dirs, files) in os.walk(rootdir):
    for dirname in dirs:
        if ':' in dirname:
            torename.append(os.path.join(path, dirname))
    for filename in files:
        if ':' in filename:
            torename.append(os.path.join(path, filename))

print "No of files/dirs to rename =", len(torename)
a = raw_input("Continue? (y/n) ")
if a == 'y':
    torename.reverse()
    for oldname in torename:
        directory, filename = os.path.split(oldname)
        newname = os.path.join(directory, filename.replace(':', '-'))
        command = 'mv %s %s > /dev/null' % (repr(oldname), repr(newname))
        os.system(command)
        f = open(logfile, 'a')
        f.write(oldname + '\n')
        f.close()
else:
    print "Aborted."
  1. इसे एक फ़ाइल में सहेजें (कहिए) का नाम बदलें।
  2. rootdirविचाराधीन सबसे बाहरी निर्देशिका में बदलें (पूर्ण पथ नाम के साथ शुरू करें / कोई शॉर्टहैंड या एनवी चर जैसे ~ अनुमत)। विशेष वर्णों से पहले \ _ को डालने की कोई आवश्यकता नहीं है - उदाहरण के लिए यदि सबसे बाहरी डायर /.../My HDD है, तो rootdir = "/.../My HDD"NOT rootdir = "/.../My\ HDD"(नोट करें "s) [मैं यह केवल इसलिए स्पष्ट कर रहा हूं क्योंकि आप अजगर से अपरिचित हो सकते हैं। कोई असम्मान नहीं। इरादा है।]
  3. logfileलॉगफ़ाइल के इच्छित स्थान में बदलें । अंत में, इस फाइल में भविष्य में संदर्भ के लिए पुनर्नामित फ़ाइलों की सूची होगी।
  4. पुकारते हैं python rename.py

चेतावनी: संगीत के पूरे GB को जोखिम में डालने से पहले एक छोटे नमूने पर परीक्षण करें।

विवरण: नाम बदलकर बाह्यतम फ़ाइलों से किया जाता है।


0

मुझे एहसास हुआ कि यह बहुत पुरानी पोस्ट है। AeroGT80 का पुनरावर्ती समाधान बहुत गहन है, लेकिन यह बहुत धीमा है। मेरे पास यह लगभग आधे घंटे के लिए एक धीमी सर्वर पर चल रहा था और यह केवल लगभग आधा हो गया था - मुझे लगता है कि यह लगभग 300 उप-निर्देशिकाओं में 73,000 फाइलें थी।

नीचे दिया गया समाधान बहुत तेज़ी से काम करेगा (यह एक-एक करके प्रत्येक फ़ाइल के बजाय एक निर्देशिका में सभी फाइलों पर काम करता है - AeroGT80 के गैर-पुनरावर्ती समाधान का उपयोग करके)। एकमात्र समस्या यह है कि यह केवल एक निर्देशिका को गहराई तक ले जाता है (इसलिए यह पूरी तरह से उसके समाधान की तरह पुनरावर्ती नहीं है), लेकिन मुझे यकीन है कि इसे आसानी से पर्याप्त रूप से संशोधित किया जा सकता है।

#!/bin/bash
for D in *; do
        if [ -d "${D}" ]; then
                #echo "${D}"
                pushd "${D}" > /dev/null
                rename 's|:|-|g' *
                popd > /dev/null
        fi
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.