অবৈধ এনকোডিং সহ ফাইলগুলি কীভাবে বাল্ক-নামকরণ করবেন বা অবৈধ এনকোডেড অক্ষর বাল্ক-রিপ্লেসমেন্ট করবেন?


15

আমার একটি ডেবিয়ান সার্ভার রয়েছে এবং আমি একটি ইন্টারনেট রেডিও স্টেশনের জন্য সংগীত হোস্ট করছি। ফাইলের নাম এবং পাথ নিয়ে আমার সমস্যা আছে কারণ প্রচুর ফাইল একটি অবৈধ এনকোডিং পেয়েছে, উদাহরণস্বরূপ:

./music/Bändname - Some Title - additional Info/B�ndname - 07 - This Title Is Cörtain, The EncÃding Not.mp3

আদর্শভাবে, আমি অক্ষর A-Z/ a-zবা সংখ্যা 0-9বা ড্যাশ -/ আন্ডারস্কোর নয় এমন সমস্ত জিনিস মুছে ফেলতে চাই _... ফলাফলটি এমন কিছুর মতো হওয়া উচিত:

./music/Bndname-SomeTitle-additionalInfo/Bndname-07-ThisTitleIsCrtain,TheEncdingNot.mp3

প্রচুর ফাইল এবং ডিরেক্টরিগুলির একটি ব্যাচের জন্য এটি কীভাবে অর্জন করবেন?

আমি এই অনুরূপ প্রশ্নটি দেখেছি: বিশেষ অক্ষরের সাথে বাল্কের নাম পরিবর্তন (বা সঠিকভাবে প্রদর্শন করা)

তবে এটি কেবল এনকোডিংটি ঠিক করে, আমি উপরে বর্ণিত হিসাবে আরও কঠোর পদ্ধতির পছন্দ করব prefer

উত্তর:


14

আপনি একই সাথে ফাইল এবং ডিরেক্টরিগুলির নাম পরিবর্তন করতে চাইলে আপনি কিছু সমস্যার সমাধান করতে যাচ্ছেন । কেবল একটি ফাইলের নামকরণ করা যথেষ্ট সহজ। তবে আপনি নিশ্চিত করতে চান ডিরেক্টরিগুলিও নতুন নামকরণ হয়েছে। আপনি কেবল না পারেন, mv Motörhead/Encöding Motorhead/Encodingযেহেতু Motorheadকলের সময়ে উপস্থিত করা হবে না।

সুতরাং, আমাদের সমস্ত ফাইল এবং ফোল্ডারগুলির গভীরতার প্রথম ট্রভারসালাল প্রয়োজন এবং তারপরে কেবলমাত্র বর্তমান ফাইল বা ফোল্ডারটির নতুন নামকরণ করতে হবে। নিম্নলিখিতটি findআমার ওএস এক্সে জিএনইউ এবং বাশ 4.2.42 নিয়ে কাজ করে।

#!/usr/bin/env bash
find "$1" -depth -print0 | while IFS= read -r -d '' file; do
  d="$( dirname "$file" )"
  f="$( basename "$file" )"
  new="${f//[^a-zA-Z0-9\/\._\-]/}"
  if [ "$f" != "$new" ]      # if equal, name is already clean, so leave alone
  then
    if [ -e "$d/$new" ]
    then
      echo "Notice: \"$new\" and \"$f\" both exist in "$d":"
      ls -ld "$d/$new" "$d/$f"
    else
      echo mv "$file" "$d/$new"      # remove "echo" to actually rename things
    fi
  fi
done

আপনি new="${f//[\\\/\:\*\?\"<>|]/}"উইন্ডোজ যে হ্যান্ডেল করতে পারে না এমন কোনও প্রতিস্থাপন করতে চাইলে আপনি ব্যবহার করে রেজেক্স পরিবর্তন করতে পারেন।

এই স্ক্রিপ্টটি সংরক্ষণ করুন rename.sh, এটি দিয়ে সম্পাদনযোগ্য chmod +x rename.sh। তারপরে, এটি কল করুন rename.sh /some/path

কোনও ফাইলের নাম সংঘর্ষ (" Notice" ঘোষণা) সমাধান করার বিষয়টি নিশ্চিত করুন ।

যদি আপনি পুরোপুরি নিশ্চিত হন যে এটি সঠিক প্রতিস্থাপন করে, echoতবে স্ক্রিপ্ট থেকে কিছুটি মুদ্রণের পরিবর্তে জিনিসটির নতুন নামকরণ করতে সরান what

নিরাপদ থাকতে, আমি প্রথমে ফাইলগুলির একটি ছোট উপসেটে এটি পরীক্ষা করার পরামর্শ দেব।


বিকল্প ব্যাখ্যা

এখানে কী চলছে তা বোঝাতে:

  • -depthডিরেক্টরিগুলি গভীরতা-পূর্বে পুনরাবৃত্তি হয়েছে তা নিশ্চিত করবে, তাই আমরা শেষ থেকে সবকিছু "রোল আপ" করতে পারি। সাধারণত, findআলাদাভাবে অনুসরণ করে (তবে প্রথম প্রস্থ নয়)।
  • -print0নিশ্চিত findআউটপুট তাই আমরা সঙ্গে এটি পড়তে পারেন, নাল-সীমা নির্দেশ করা হয় read -d ''মধ্যে fileপরিবর্তনশীল। এটি করা আমাদের সমস্ত ধরণের অদ্ভুত ফাইলের নাম, স্পেস সহ নতুন ফাইলগুলি সহ ডিল করতে সহায়তা করে।
  • আমরা ফাইলটির ডিরেক্টরিটি পেয়ে যাব dirname। আপনার ভেরিয়েবলগুলি যথাযথভাবে উদ্ধৃত করতে ভুলবেন না, অন্যথায় স্পেস বা গ্লোববিং অক্ষরের কোনও পথই এই স্ক্রিপ্টটি ভেঙে দেবে।
  • আমরা আসল ফাইলের নাম (বা ডিরেক্টরি নাম) এর সাথে পেয়ে যাব basename
  • তারপরে, আমরা $fবাশের স্ট্রিং প্রতিস্থাপনের ক্ষমতাগুলি ব্যবহার করে কোনও অবৈধ অক্ষর মুছে ফেলি। অবৈধ অর্থ এমন কোনও কিছু যা ছোট বা বড় হাতের অক্ষর, একটি অঙ্ক, একটি স্ল্যাশ ( \/), একটি বিন্দু ( \.), আন্ডারস্কোর বা বিয়োগ-হাইফেন নয়।
  • যদি $fইতিমধ্যে পরিষ্কার থাকে (পরিষ্কার করা নামটি বর্তমান নামের সাথে একরকম), এড়িয়ে যান।
  • যদি $newইতিমধ্যে ডিরেক্টরিতে বিদ্যমান থাকে $d(যেমন, আপনার কাছে ফাইলগুলির নাম resumeএবং résuméএকই ডিরেক্টরি রয়েছে), সতর্কতা জারি করুন। আপনি এটির নাম পরিবর্তন করতে চান না, কারণ কিছু সিস্টেমে mv foo fooসমস্যা দেখা দেয়। তা না হলে,
  • আমরা শেষ পর্যন্ত এর নতুন নামে নতুন ফাইল (বা ডিরেক্টরি) নামকরণ করি

এই যেহেতু শুধুমাত্র গভীরতম অনুক্রমের কাজ করবে পুনঃনামকরনের Motörhead/Encödingকরতে Motorhead/Encodingদুটি ধাপে সম্পন্ন করা হয়:

  1. mv Motörhead/Encöding Motörhead/Encoding
  2. mv Motörhead Motorhead

এটি নিশ্চিত করে যে সমস্ত প্রতিস্থাপন সঠিক ক্রমে সম্পন্ন হয়েছে।


ফাইল এবং পরীক্ষা রান উদাহরণ

একটি বেস ফোল্ডার নামক কিছু ফাইল ধরে নেওয়া যাক test:

test
test/Motörhead
test/Motörhead/anöther_file.mp3
test/Motörhead/Encöding
test/Randöm
test/Täst
test/Täst/Töst
test/with space
test/with-hyphen.txt
test/work
test/work/resume
test/work/résumé
test/work/schedule

এখানে একটি রান ইন ডিবাগ মোডের (আউট echoসামনের দিকে mv) আউটপুট , অর্থাত, যে আদেশগুলি ডাকা হবে এবং সংঘর্ষের সতর্কতা:

mv test/Motörhead/anöther_file.mp3 test/Motörhead/another_file.mp3
mv test/Motörhead/Encöding test/Motörhead/Encoding
mv test/Motörhead test/Motorhead
mv test/Randöm test/Random
mv test/Täst/Töst test/Täst/Tost
mv test/Täst test/Tast
mv test/with space test/withspace
Notice: "resume" and "résumé" both exist in test/work:
-rw-r—r--  …  …  test/work/resume
-rw-r—r--  …  …  test/work/résumé

বিজ্ঞপ্তিটি বার্তা অভাবে with-hyphen.txt, scheduleআর testনিজেই।


1
mvইতিমধ্যে যে গন্তব্যটি উপস্থিত রয়েছে সেখানে মামলা পরিচালনা করতে আপনি যুক্তি যুক্ত করতে চাইতে পারেন , যা ঘটতে পারে (1) যদি আপনার কাছে ইতিমধ্যে পরিষ্কার ফাইল রয়েছে (ফলস্বরূপ mv foo foo), বা (2) যদি আপনার একই নামের ফাইলগুলি বাদে থাকে বিশেষ অক্ষরের জন্য (উদাহরণস্বরূপ, mv Encöding Encodingযেখানে ইতিমধ্যে আপনি ইতিমধ্যে একটি Encodingফাইল রয়েছে Encöding)।
স্কট

ভাল ধারণা, ধন্যবাদ। সেক্ষেত্রে কী করা উচিত সে সম্পর্কে কোনও নির্দিষ্ট পরামর্শ? মঞ্জুর - একটি পরিষ্কার এবং বুদ্ধিমান উপায়ে এটি অর্জন করা প্রথমটির চেয়ে শক্ত। আপনার যদি কিছু থাকে তবে অবশ্যই সম্পাদনা করতে নির্দ্বিধায়।
21

আমি বিশ্বাস করি না যে সংঘর্ষগুলি স্বয়ংক্রিয়ভাবে পরিচালনা করার বিষয়ে চিন্তা করা বুদ্ধিমান হয় - কেবল তাদের ব্যবহারকারীর কাছে সনাক্ত করুন এবং তাকে সেগুলি পরিচালনা করতে দিন। আপনার পরামর্শ অনুসারে আমি আপনার উত্তর সম্পাদনা করেছি।
স্কট

"এনকিডিং" দিয়ে উদাহরণটি ব্যবহারের জন্য +1 খুব বেশি ফ্যান! :-)
মার্সেল

তিন বছর পরও আমি এখানে ফিরে আসি। তাই দরকারী! :-)
আফার

15

আমি জানি যে এটি আপনি যা চেয়েছিলেন ঠিক তা নয়, তবে আপনি যদি মূল এনকোডিংটি জানেন তবে সম্ভবত আপনি convmvএনকোডিংটি ইউটিএফ -8 এ পরিবর্তন করতে পারেন যা বেশিরভাগ সমস্যার সমাধান করতে পারে।

এটি কিছু অবৈধ-এনকোডযুক্ত পোলিশ ফাইলের নাম সহ একটি ফোল্ডারে আমার জন্য কাজ করেছে:

convmv -f cp1250 -t utf8 -r .

মনে রাখবেন যে এই আদেশটি আসলে কোনও কিছুর নাম পরিবর্তন করে না; --notestফাইলগুলি সত্যই নামকরণ করতে বিকল্প যুক্ত করুন ।


1
যাঁদের একটি স্ট্যাটিক সেট রয়েছে (বা চরসেটগুলির বিচিত্র মিশ্রণ নেই) তাদের পক্ষে convmvবিকল্পটি আশ্চর্যজনকভাবে সহজ এবং নিখুঁত। ওপি-র ক্ষেত্রে, সম্ভাব্য সংখ্যক চরসেট রয়েছে, এটি অন্য উত্তরটির সাথে একত্রীকরণ হতে পারে, যেহেতু convmvএটি কখন বা কখন এটি সঠিক ফর্ম্যাটের মুখোমুখি হয় না তা জানে বলে মনে হয়। চার্সেটের মাধ্যমে, মাধ্যমে লুপিং করে convmv --list, কেউ সেগুলিকে সঠিকভাবে এনকোড করে আনতে পারে।

1
এর অর্থ হ'ল, যদি ওপি হিসাবে, কোনও ডেবিয়ান সার্ভার চালায় তবে অবশ্যই এই দিনগুলিতে কেউ ইউটিএফ 8 ধরে নিবে, সেক্ষেত্রে যে কেউ মূল অক্ষর রাখতে পারে। আমার কাছে কিছু নর্ডিক চরগুলির ফোল্ডার ছিল এবং আমি ব্যবহার করেছি: convmv -t utf8 --nfc -f iso-8859-1 --notest -r .- --nfcওএস এক্স বা তার আগে লিনাক্সের সাথে সামঞ্জস্য করা ছিল, কেবল টাইপিং convmv(কার্যকর) বিকল্পগুলি দেয়।

0

আমি জানি, আপনি নাম পরিবর্তন সম্পর্কে জিজ্ঞাসা করেছিলেন।

তবে আপনি MusicBrainz Picard এর মতো সফটওয়্যারটি ব্যবহার করে সহজেই সমস্যাটি ডজ করতে পারেন ।

এটি সংগীত সনাক্ত করতে সক্ষম (অডিও ফিঙ্গারপ্রিন্টিং), বিশাল সংগীতব্রেইনজ ডাটাবেস থেকে সমস্ত প্রয়োজনীয় ডেটা (কভার চিত্রগুলি সহ যেখানে উপলব্ধ রয়েছে) ডাউনলোড করতে এবং ফাইলগুলি চারপাশে সরিয়ে নিতে যাতে আপনার সংগ্রহটি আপনার পছন্দ মতো কোনও প্যাটার্ন ফিট করতে পারে। আমি এটি বছরের পর বছর ধরে ব্যবহার করছি এবং এটি সিরিলিক থেকে আরবি পর্যন্ত যে কোনও কিছুর সাথে সর্বদা নিখুঁতভাবে কাজ করে; এবং অবশ্যই (কমপক্ষে লাতিন-ভিত্তিক স্ক্রিপ্টগুলির জন্য) এটি ASCII তে রূপান্তরও করতে পারে।

যতক্ষণ ফাইলগুলি পঠনযোগ্য এবং সম্পূর্ণ হয় ততক্ষণ এই পদ্ধতির সাথে আপনার সংগ্রহটি কীভাবে অগোছালো / খারাপভাবে নামকরণ করা হয়েছে তা আসলেই গুরুত্বপূর্ণ নয়।

(আমি কি এটি নিখরচায় উল্লেখ করেছি? মুক্ত বাকী হিসাবে এবং নিখরচায় বিয়ারের মতোই? সফ্টওয়্যার এবং ডাটাবেস উভয়ই ..?)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.