পুনরাবৃত্তভাবে একটি উপ-ডিরেক্টরিগুলি পুনরায় নামকরণ করুন যা কোনও রেজেক্সের সাথে মেলে


11

আমার কাছে একটি মিডিয়া সার্ভার রয়েছে যার নাম ফোল্ডার রয়েছে Series। ( /media/Expansion2/Series/)

এটিতে আমার কাছে (চমক!) টিভি সিরিজ রয়েছে। এগুলি কেবল শোয়ের নাম, যেমন,/media/Expansion2/Series/The Big Bang Theory/

প্রতিটি শোয়ের ফোল্ডারের ভিতরে (এবং এটিই সমস্যাটি রয়েছে) আমার seasonতু ফোল্ডার রয়েছে। আমার কাছে বর্তমানে নিম্নলিখিত দুটি কনভেনশনগুলির মিশ্রণ রয়েছে (আরও কয়েকটি সহ সম্ভবত, সম্ভবত):

  1. /media/Expansion2/Series/The Big Bang Theory/The Big Bang Theory Season 1
  2. /media/Expansion2/Series/The Big Bang Theory/Season 2

শেষ পর্যন্ত, আমি সমস্ত ফোল্ডারটির নাম পরিবর্তন করতে চাই Season #

একটি রেজেক্স হিসাবে, আমি সম্ভবত কিছু বলতে চাই s/.*(Season \d)/$1

কেবল ফোল্ডারগুলিতে প্রযোজ্য, ফাইল নয়। আমার সম্ভবত এটিও উল্লেখ করা উচিত যে এটি প্রায় 50+ শো সাব ফোল্ডারগুলির জন্য, সুতরাং এটি /media/Expansion2/Series/স্তর থেকে শুরু করে প্রতিটি সিরিজটি অনুসন্ধান করা প্রয়োজন :)

উত্তর:


12

ডেবিয়ান এবং ডেরিভেটিভগুলিতে (উবুন্টু সহ):

find /media/Expansion2/Series/ -type d -exec rename -n 's/.*(Season \d)/$1/' {} ";"

renameকমান্ড পার্ল প্যাকেজের অংশ। এটি অন্যান্য বিতরণ দ্বারা সরবরাহ করা হয় না, তারা পরিবর্তে স্ট্যান্ডার্ড লিনাক্স renameকমান্ড সরবরাহ করে যা এখানে কার্যকর নয়।

যদি rename -n(-সত্যই নয়) কী করতে চায় তা প্রদর্শন করে এবং আপনার পক্ষে এটি ঠিক আছে, -ন বাদ দিন এবং এটি ঘটিয়ে দিন।


অবশ্যই বলবেন, আমি গত কয়েকদিন ধরে এই পদ্ধতিটি বিশেষভাবে দরকারী বলে খুঁজে পেয়েছি - কেবল ফোল্ডারগুলির জন্যই নয়, ফাইলগুলিও। ধন্যবাদ।
ডেনহাম কোট

1
যতদূর আমার মনে আছে, সরঞ্জামটি কেবলমাত্রrename দেবিয়ানকে ডাকা হয় । পূর্বে উল্লিখিত মানক কমান্ডের সাথে নামের সংঘর্ষ এড়াতে উবুন্টুতে (এবং কিছু স্বাদে) এটি কখনও কখনও (তবে সর্বদা নয়) এর অধীনে পাওয়া যায় । এখানে লুবুন্টুতে, সরঞ্জামটিকে নিজেই বলা হয় তবে এটি সিমলিংক চেইনের কারণে বলা যেতে পারে , যেখানে এর সামান্য পরিবর্তিত সংস্করণ রয়েছে । renameprenameprenamerename/usr/bin/rename -> /etc/alternatives/rename -> /usr/bin/file-renamefile-renameprename
সিনট্যাক্সেরর

অসাধারণ! এটি আমাকে একাধিক ডিরেক্টরিতে একাধিক ফাইলের জন্য তা করতে বাধ্য করে!
ইউসুব্র্যাসিলিও

2

নীচের স্নিপেটের Season [0-9]অধীনে প্রতিটি শো ডিরেক্টরিতে শেষ সংঘটন হওয়ার আগে ঘটে এমন কোনও কিছু স্ট্রিপ করে /media/Expansion2/Series। কোনও নিয়মিত প্রকাশের প্রয়োজন নেই, কেবল গ্লোবস।

cd /media/Expansion2/Series
for show in ./*/; do
    (
        cd "$show" || { echo "cd failed.  Skipping $show"; exit 1; }
        for season in ./*Season\ [[:digit:]]*/; do
                season_prefix=${season%Season [[:digit:]]*}
                mv "$season" ./"${season#$season_prefix}"
        done
    )
done

2

আপনি যদি এটি নিরাপদে খেলতে পছন্দ করেন এবং কেবল নামকরণ some show/some show stuffকরুন some show/stuff:

for d in */; do
  for f in "$d${d%/} *"; do
    mv "$f" "${d}${f%$d${d%/} }"
  done
done

আপনি যদি আগে সমস্ত কিছু ছিনিয়ে নিতে চান Season:

for x in */*Season*; do
  mv "$x" "${x%/*}/${x##*Season}Season"
done

${var#PATTERN}শুরুতে প্যাটার্নগুলি স্ট্রিপ $varদেয় এবং ফলাফলটি দেয়। ${var%PATTERN}শেষে একই কাজ করে। ${var#PATTERN}এবং ${var%PATTERN}যথাক্রমে সংক্ষিপ্ততম মিলের উপসর্গ এবং প্রত্যয়টি সরিয়ে ফেলুন; ${var##PATTERN}এবং ${var%%PATTERN}দীর্ঘতম ম্যাচটি সরিয়ে দিন।


0

ভবিষ্যতে তারা সহায়ক হতে পারে এই আশায় আমি আরও দুটি সমাধান পোস্ট করতে যাচ্ছি। এগুলি কাজ করে লিনাক্স প্রশাসকদের কাছ থেকে এসেছিল। এই পেরেকটিতে কত হাতুড়ি কাজ করবে তা কেবল দেখানোর জন্য যায়!

সমাধান 1:

হাই ডেনহাম,

আমি এখানে কয়েকটি অনুমান করতেই চলেছি, উদাহরণস্বরূপ যে "XXX সিজন #" দিয়ে ডিরেক্টরিটির অংশটি সর্বদা "বাইরের" ডিরেক্টরিতে থাকবে (পাতার নোড)।

যাই হোক না কেন, আমি একটু স্ক্রিপ্ট লিখব। এর মতো কিছু কাজ করা উচিত (ডিরেক্টরিগুলির সমস্ত স্পেস ক্যাপচার করে তা নিশ্চিত করতে ভেরিয়েবলগুলির চারপাশে ডাবল উক্তিগুলি নোট করুন):

find /media/Expansion2/Series/ -type d | while read olddir
do 
   newdir=`echo "${olddir}" | awk -F "/" '$NF ~ /Season/ { last=substr($NF,index($NF, "Season")); while (i<(NF-1)) { i++; printf("/%s", $i) }; printf("/%s\n", last) } $NF !~ /Season/ { print }'`
   if [ "${olddir}" != "${newdir}" ]
   then
       mv "${olddir}" "${newdir}"
   fi
done

অবশ্যই "mv" $ {olddir} "" $ {newdir} "" কমান্ড দিয়ে এটি চালানোর আগে আপনি নিশ্চিত হওয়ার জন্য "প্রতিধ্বনি" $ {olddir} "" $ {newdir something "" এর মতো কিছু রাখা উচিত আপনার প্রত্যাশিত ফলাফলগুলি পাওয়া বা আপনি অন্য মাথাব্যথার সাথে শেষ করতে পারেন :- পি


সমাধান 2:

হাই ডেনহাম,

বেশিরভাগ উত্তর ইতিমধ্যে প্রশ্নে ছিল। যাইহোক সিরিজ ফোল্ডার থেকে নীচের মতো কিছু চালানো ঠিক কাজ করা উচিত:

find -mindepth 2 -maxdepth 2 -type d | while read dir; do mv -T "$dir" "`dirname "$dir"`/`basename "$dir" | sed "s/.*Season \([0-9]*\)$/Season \1/i"`"; done  


ব্যাখ্যা:
• সন্ধান করুন -মাইন্ডপথ 2 -ম্যাক্সডেপথ 2-টাইপ ডি (ডিরেক্টরিগুলি দুটি স্তরের নীচে তালিকাবদ্ধ করুন)
• পড়ার সময়; (প্রতিটি ডিয়ারের লুপ)
• এমভি -টি "$ দির" (উত্স দিরকে সরান ... -তাহলে ত্রুটি পেতে প্রয়োজন হয় যদি Seতু ফোল্ডারগুলি অনন্য না থাকে অর্থাৎ আপনার কাছে "বিগ ব্যাং থিওরি সিজন না থাকে) 22 "এবং" একই ডিরেক্টরিতে "মরসুম 22")
• dirname "$ dir" যেখানে dir • বেসনাম "$ dir" সেই ডিরেক্টরিটি • সেড "s /। Seতুটির
নাম দেয় ([0-9]) ) $ / মরসুম \ 1 / i "কেবলমাত্র ক্ষেত্রে ক্ষেত্রে সংবেদনশীল রিজেক্সেপ দিয়ে যাদুটি সম্পূর্ণ করে।

আমার ছোট পরীক্ষায় এটি কাজ করেছে (এমভির আগে প্রতিধ্বনি দিয়ে প্রথমে চেষ্টা করুন):

someuser@linux-box:/tmp/Series$ find
.
./The Big Bang Theory
./The Big Bang Theory/Season 2
./The Big Bang Theory/Season 2/file1.avi
./The Big Bang Theory/Season 2/file 3.avi
./The Big Bang Theory/Season 2/file2.avi
./The Big Bang Theory/Season 2/file
./The Big Bang Theory/Season 2/3.avi
./The Big Bang Theory/The Big Bang Theory Season 1
./The Big Bang Theory/The Big Bang Theory Season 1/file1.avi
./The Big Bang Theory/The Big Bang Theory Season 1/file 3.avi
./The Big Bang Theory/The Big Bang Theory Season 1/file2.avi
./The Big Bang Theory/The Big Bang Theory Season 1/file
./The Big Bang Theory/The Big Bang Theory Season 1/3.avi
./Other Series
./Other Series/Season 2
./Other Series/Stre dsfdf sd dSeason 3

someuser@linux-box:/tmp/Series$ find -mindepth 2 -maxdepth 2 -type d | while read dir; do mv -T "$dir" "dirname "$dir"/basename "$dir" | sed "s/.*Season \([0-9]*\)$/Season \1/i""; done
mv: ./The Big Bang Theory/Season 2' and./The Big Bang Theory/Season 2' are the same file
mv: ./Other Series/Season 2' and./Other Series/Season 2' are the same file

someuser@linux-box:/tmp/Series$ find
.
./The Big Bang Theory
./The Big Bang Theory/Season 2
./The Big Bang Theory/Season 2/file1.avi
./The Big Bang Theory/Season 2/file 3.avi
./The Big Bang Theory/Season 2/file2.avi
./The Big Bang Theory/Season 2/file
./The Big Bang Theory/Season 2/3.avi
./The Big Bang Theory/Season 1
./The Big Bang Theory/Season 1/file1.avi
./The Big Bang Theory/Season 1/file 3.avi
./The Big Bang Theory/Season 1/file2.avi
./The Big Bang Theory/Season 1/file
./The Big Bang Theory/Season 1/3.avi
./Other Series
./Other Series/Season 3
./Other Series/Season 2

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