কাউন্টার ওভার সাব-ডিরেক্টরিতে ফাইলগুলির নাম পরিবর্তন করুন


1

এটিতে বেশ কয়েকটি ডিরেক্টরি সহ আমার পিতামহুল ডিরেক্টরি রয়েছে। আমি, আবার, একাধিক উপ-ডিরেক্টরি আছে, তাদের অনেকগুলি চিত্র রয়েছে:

Parent
|
├──dirA
|       ├──sub_A1
|       |     ├──00000001.jpg 
|       |     ├──00000002.jpg 
|       |     ├──00000003.jpg
|       |
|       ├──sub_A2
|             ├──00000001.jpg 
|             ├──00000002.jpg 
|             ├──00000003.jpg
|    
├──dirB
       ├──sub_B1
       |     ├──00000001.jpg 
       |     ├──00000002.jpg 
       |     ├──00000003.jpg
       |
       ├──sub_B2
             ├──00000001.jpg 
             ├──00000002.jpg 
             ├──00000003.jpg

আমি সমস্ত চিত্রের বর্ধিত পদ্ধতিতে নাম পরিবর্তন করতে চাই 1. যেমন 1.jpg, 2.jpg, 3.jpg ইত্যাদি However তবে, আমি চাই না যে উপ-ডিরেক্টরিগুলির জন্য কাউন্টারটি পুনরায় সেট করা হোক।

সুতরাং এই আউটপুট হবে:

Parent
|   
├──dirA
|       ├──sub_A1
|       |     ├──1.jpg 
|       |     ├──2.jpg 
|       |     ├──3.jpg
|       |
|       ├──sub_A2
|             ├──4.jpg 
|             ├──5.jpg 
|             ├──6.jpg
|    
├──dirB
       ├──sub_B1
       |     ├──7.jpg 
       |     ├──8.jpg 
       |     ├──9.jpg
       |
       ├──sub_B2
             ├──10.jpg 
             ├──11.jpg 
             ├──12.jpg

এই উত্তরটির প্রায় সমাধান রয়েছে বলে মনে হচ্ছে, তবে কাউন্টারটি পুনরায় সেট হয় না।

উত্তর:


0

নিম্নলিখিতটি কাজ করে বলে মনে হচ্ছে:

find DirPath -type f -name "*.*"|\
  for (( n=1;; ++n ));\
    do l="`line`"||break; mv "$l" "${l%/*}/$n.${l##*.}"; done

-nameদফা কারণ ফাইলের নাম বিভাজন বিফল হয়, এতে কোন ডট, যদিও আপনি পছন্দ করতে পারে -iname "*.jpg"doদফা extensionless ফাইলের নাম হ্যান্ডেল করতে বিস্তারিত যেতে পারে।

নোট করুন যে lineফাইলের শেষে একটি ত্রুটি প্রদান করে, তাই ||breakলুপটি সমাপ্ত করে।

কমান্ডটি প্রত্যাশার মতো কাজ করে তা নিশ্চিত করার echoআগে আমি যুক্ত করার পরামর্শ দিই mv: আপনি এই আউটপুটটি পরিবর্তিত পরিবর্তনগুলির রেফারেন্স হিসাবে সংরক্ষণ করতে পারেন।

আপনার যদি নম্বরগুলি নির্ধারণের আগে ডিরেক্টরিগুলি এবং ফাইলগুলি সাজানোর দরকার হয় যা একটি বোধগম্য কাজ বলে মনে হচ্ছে, একটি সারণি ফিল্টার যুক্ত করুন, /ফিল্ড বিভাজক হিসাবে উল্লেখ করে :

find DirPath -type f -name "*.*"|sort -t /|\
  for (( n=1;; ++n ));\
    do l="`line`"||break; mv "$l" "${l%/*}/$n.${l##*.}"; done

আপনাকে অনেক ধন্যবাদ, এটি কাজ করে! আমি কি জিজ্ঞাসা করতে পারি, আমি কীভাবে নিশ্চিত করতে পারি যে উপ-ডিরেক্টরিগুলি বর্ণানুক্রমিক ক্রমে প্রক্রিয়া করা হবে? এখন মনে হচ্ছে, ফোল্ডারগুলি এলোমেলো ক্রমে প্রক্রিয়া করা হবে?
আপেল-কমলা

হ্যাঁ, findকেমন বিকল্প আছে না, কিন্তু আপনার মধ্যে কেমন ফিল্টার যোগ করতে পারেন findকমান্ড forলুপ: find ... |sort -t /|for ...। এটি /ফিল্ড বিভাজক হিসাবে ব্যবহার করে ডিরেক্টরি এবং ফাইল উভয়কে সাজিয়ে দেবে।
এএফএইচ

আমি এটি আমার উত্তরটিতে যুক্ত করেছি, কারণ এটি চাওয়াটি বোধগম্য মনে হয়।
এএফএইচ

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

আহ হ্যাঁ, আমি এই মন্তব্য করার জন্য ধন্যবাদ। আমার ডেটাতে ফাইলের নামগুলি সমস্ত খাঁটি সংখ্যাসূচক, এবং উপ-ডিরেক্টরিগুলির নামগুলি সমস্ত বর্ণানুক্রমিক। আমি আপনার উত্তর upvote করতে পারবেন না, দুঃখিত!
আপেল-কমলা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.