টার্মিনাল দিয়ে ফাইলের নাম থেকে সমস্ত কলোন প্রতিস্থাপন করুন


12

আমার এইচডিডি তে একটি গিগাবাইটের মূল্যবান সংগীত রয়েছে যা EXT4 দিয়ে ফর্ম্যাট করা হয়েছিল। আমি এই ফাইলগুলিকে একটি FAT বিন্যাসিত এইচডিডি পার্টিশনে স্থানান্তরিত করতে চাই। তবে, আমি আমার বেশিরভাগ ফাইল সরাতে পারি না কারণ নামগুলিতে তাদের ":" রয়েছে (উদাহরণস্বরূপ, অপেরার জন্য "আইন 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' {} \;

@ ক্রিস্টোফার ডিরেক্টরিগুলির জন্য কমান্ডটি ব্যর্থ হবে যদি তাদের নামে দুটি স্তরের ডিরেক্টরি থাকে: উদাহরণস্বরূপ: / 1: / 2: / যেখানে 2: এটি একটি ডিরেক্টরি। অবশ্যই, যদি রায়ের পরিস্থিতি এটি না হয় তবে এটি কাজ করবে।
এস প্রশান্ত

উপ-dirs একাধিক স্তরের জন্য ব্যবহার করুন: for i in {1..20}; do find . -maxdepth $i -mindepth $i -name "*:*" -exec rename 's|:|-|g' {} \;; done। দির সর্বাধিক গভীরতায় 20 পরিবর্তন করুন। কাঠামো। সঠিক হতে হবে না - বড় হতে পারে। খুব বেশি সংখ্যক হিসাবে সেট করা থাকলে সময় লাগবে।
এস প্রশান্ত

0

আমি এখনই আমার লিনাক্স মেশিনে নেই তাই আমি কেবল মোটামুটি তথ্য দিতে পারি।

লিনাক্সের একটি কমান্ডলাইন ইউটিলিটি রয়েছে 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বিবেচনাধীন বহিরাগত ডিরেক্টরিতে পরিবর্তন করুন (/ দিয়ে শুরু করে পুরো পথের নামটি ব্যবহার করুন ~ অনুমোদিত নয় শর্টহ্যান্ডস বা এনভিভ ভেরিয়েবল)। যদি দূরতম Dir /.../My HDD এর, করা হয় - উদাহরণস্বরূপ বিশেষ অক্ষর সামনে লাগাতে \ কোন প্রয়োজন নেই rootdir = "/.../My HDD"না rootdir = "/.../My\ HDD"। (নোট "গুলি) [আমি এই স্পষ্ট হচ্ছে না শুধুমাত্র কারণ আপনার পাইথন সঙ্গে অপরিচিত হতে পারে কোন অসম্মান অভিপ্রেত.]
  3. logfileলগফাইলে কাঙ্ক্ষিত স্থানে পরিবর্তন করুন । শেষ পর্যন্ত, এই ফাইলটিতে পুনর্নবীকরণ করা ফাইলগুলির তালিকা থাকবে - ভবিষ্যতের রেফারেন্সের জন্য।
  4. কল করুন python rename.py

সতর্কতা: পুরো জিবি সংগীত ঝুঁকির আগে একটি ছোট নমুনায় পরীক্ষা করুন।

বিশদ: পুনর্নামকরণ আভ্যন্তরীণতম ফাইলগুলি থেকে সঞ্চালিত হয়।


0

আমি বুঝতে পারি এটি একটি খুব পুরানো পোস্ট। AeroGT80 এর পুনরাবৃত্ত সমাধান খুব সম্পূর্ণ, তবে এটি বেশ ধীর। আমার এটি ধীর গতির সার্ভারে প্রায় আধা ঘন্টা চলছিল এবং এটি প্রায় অর্ধেক হয়ে গেছে - আমি মনে করি এটি প্রায় 300 টি সাব-ডিরেক্টরিতে প্রায় 73,000 ফাইল ছিল।

নীচের সমাধানটি আরও দ্রুত পরিচালনা করবে (এটি একটি ডিরেক্টরিতে সমস্ত ফাইলের পরিবর্তে প্রতিটি ফাইলের পরিবর্তে একের পর এক - এরোজিটি 80 এর নন-রিকার্সিভ সমাধান ব্যবহার করে) পরিচালনা করে। একমাত্র সমস্যাটি হ'ল এটি কেবল একটি ডিরেক্টরি নীচে নেমে গেছে (সুতরাং এটি সম্পূর্ণরূপে পুনরাবৃত্ত তার সমাধানের মতো নয়) তবে আমি নিশ্চিত যে এটি সহজেই যথেষ্ট পরিমাণে সংশোধন করা যেতে পারে।

#!/bin/bash
for D in *; do
        if [ -d "${D}" ]; then
                #echo "${D}"
                pushd "${D}" > /dev/null
                rename 's|:|-|g' *
                popd > /dev/null
        fi
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.