যে ফোল্ডারের নামটি একটি তারিখ তা কীভাবে প্রতিস্থাপন করতে হবে, যেমন বছর, মাস, তারিখের ফোল্ডার স্তরক্রম সহ ওয়াইওয়াইওয়াইএমএমডিডি?


8

আমার ফোল্ডারের একটি তালিকা রয়েছে যার নামগুলির জন্য তারিখ রয়েছে। তারিখগুলি YYYYYMDD ফর্ম্যাটে (উদাঃ 20150129)। এই ফোল্ডারগুলির মধ্যে পাঠ্যের নথি যা সেই নির্দিষ্ট তারিখের সাথে সম্পর্কিত।

আমি এগুলি ফোল্ডার শ্রেণিবিন্যাসে বছরের পর বছর থেকে মাসিকের পুনর্গঠন করতে এবং পাঠক্রমের নথিকে হায়ারার্কির নীচে সংশ্লিষ্ট 'তারিখ' ফোল্ডারে সরিয়ে নিতে চাই।

অন্য কথায় আমি চাইব যে 'রুট' ফোল্ডারটি ২০১৫ সালের মতো নামকরণ করা হোক এবং তারপরে 01 টির মতো মাসের মতো উপ-ফোল্ডার তৈরি করুন, এবং তারপরে 29 টির মতো তারিখের সাথে আরও সাব-ফোল্ডার তৈরি করুন যা সংশ্লিষ্ট পাঠ্য নথিগুলিকে ধারণ করে ।

তাই পথটি দেখতে 2015/01/29/file.txtবা দেখতে হবে 2015>01>29>file.txt

আমি অটোমেটরের দিকে একবার নজর রেখেছি এবং মনে হচ্ছে এটি ভুল হতে পারে যদিও এর মতো কিছু সম্ভব নয়, তাই আমি জানতে চাই ...

  1. এই সমস্যাটির কোনও সহজ সমাধান রয়েছে যা কোনও সাধারণ মানুষ বুঝতে পারে, উদাহরণস্বরূপ একটি অটোমেটার ওয়ার্কফ্লো, বা এটির জন্য কি টার্মিনাল কমান্ড এবং নিয়মিত প্রকাশের কিছু বোঝার প্রয়োজন?

  2. আসলে এই সমস্যার সমাধান হলে একজন কীভাবে এই সমস্যার সমাধান করবেন?


এই প্রশ্নটিকে "খুব বিস্তৃত" হিসাবে বন্ধ করার পক্ষে যারা ভোট দিয়েছেন, কেন? আমি এই প্রশ্নটি সম্পর্কে "খুব বিস্তৃত" কী সম্পর্কে আগ্রহী?
ব্যবহারকারী 3439894

এই ওয়াইওয়াইএমএমডিডি ফোল্ডারগুলি সরাসরি এক মাস্টার ফোল্ডারের ভিতরেই রয়েছে বা এগুলি কি বিস্তৃত শ্রেণিবিন্যাসে ছড়িয়ে পড়েছে?
nohillside

@ পেট্রিক্স আমার ক্ষেত্রে তারা সবাই একই ডিরেক্টরি বা মাস্টার ফোল্ডারে
রয়েছেন

উত্তর:


8

এই সমস্ত YYYYMMDD ফোল্ডারগুলি ধরে নেওয়া একই প্যারেন্ট ডিরেক্টরিটির অংশ যা আপনি চালাতে পারেন

cd PARENT_DIRECTORY
for d in */; do
    [[ $d =~ [0-9]{8}/ ]] || continue
    mkdir -p -- "${d:0:4}/${d:4:2}"
    mv -- "$d" "${d:0:4}/${d:4:2}/${d:6:2}"
done
  • for d in */; doলুপ সব ডিরেক্টরির এন্ট্রি সার্চ, trailing /নিশ্চিত করে যে শুধুমাত্র ডিরেক্টরির নাম আসলে মেলে
  • [[ $d =~ [0-9]{8}/ ]] বর্তমান এন্ট্রিটি 8 টি সংখ্যার সমন্বয়ে গঠিত কিনা তা পরীক্ষা করে এবং পরবর্তী এন্ট্রিটি না থাকলে অবিরত থাকে
  • ${d:0:4}/${d:4:2}/${d:6:2}bashনতুন পাথ যুক্ত স্ট্রিং তৈরি করতে প্যারামিটারের সম্প্রসারণ ব্যবহার করে
  • --উভয় mkdirএবং mvক্ষেত্রে বাধা সমস্যা সঙ্গে ডিরেক্টরি বা ফাইল নাম শুরু হয় -। এটি এখানে ঘটতে পারে না তবে এটি সম্ভবত ভাল অনুশীলন।

আসল স্ক্রিপ্টটি কীভাবে উন্নত করা যায় সে সম্পর্কে ধারণার জন্য @ ইটারডন এবং @ ব্যবহারকারী 3439894 কে ধন্যবাদ


উত্তরের জন্য ধন্যবাদ, এটি নিখুঁতভাবে কাজ করে! আমি মনে করি @gggarside সরবরাহকারীর চেয়ে এই সমাধানটি আরও ভাল কারণ এটি আরও দ্রুততর, বিশেষত যখন হাজার হাজার পাঠ্য নথি সহ বিশালাকার কর্পাসের সাথে কাজ করে।
ডেভিডজনারজন

8

আপনি টার্মিনাল এ নিম্নলিখিত ব্যবহার করতে পারেন। cdসমন্বিত ফোল্ডারে যান, তারপরে নিম্নলিখিতটি চালান:

find . -type f -exec bash -c \
  'F=$(sed -E "s#^\./([0-9]{4})([0-9]{2})([0-9]{2})#\1/\2/\3#" <<< $1);\
  mkdir -p -- $(dirname "$F");\
  mv -- "$1" "$F"' - {} \;

find . -type fবর্তমান ডিরেক্টরি প্রতিটি ফাইল পুনরাবৃত্তভাবে প্রাপ্ত।
-exec bash -cনিম্নলিখিত কমান্ডগুলি চালনার জন্য একটি শেল খোলে।
F=$(…)ফোল্ডারগুলিতে পাথটি ম্যানিপুলেট করার জন্য একটি সাবশেল খোলে এবং ফাইলের পাতায় সেড ব্যবহার করে।
^\./([0-9]{4})([0-9]{2})([0-9]{2})তিনটি ক্যাপচার গ্রুপ সহ একটি রেইজেক্স, নিম্নরূপ: প্রতিস্থাপন, যেখানে প্রতিটি ক্যাপচার গ্রুপ ( , ইত্যাদি) দ্বারা পৃথক করা হয় । ফাইলগুলি সরানোর জন্য ডিরেক্টরিগুলি তৈরি করে। প্রতিটি ফাইলকে তার সংশ্লিষ্ট ফোল্ডারে স্থানান্তরিত করে।
\1/\2/\3\1/
mkdir -p -- $(dirname "$F")
mv -- "$1" "$F"

এটি বাম দিকের শ্রেণিবিন্যাস নেয় এবং এটিকে ডানদিকে শ্রেণিবিন্যাসে রূপান্তরিত করে:

├── 20170201               └── 2017
   └── abcdefghij             ├── 02
└── 20170302                      └── 01
    └── abcdefghij 2                  └── abcdefghij
                               └── 03
                                   └── 02
                                       └── abcdefghij 2

নাম হিসাবে একটি তারিখ সম্বলিত ফোল্ডারে যদি অন্য ফাইল থাকে তবে সেগুলি সরানো হবে যেন তারা কোনও ফোল্ডার। এটি রোধ করতে, দ্বিতীয় লাইনটি এর সাথে প্রতিস্থাপন করুন:

  'F=$(sed -E "s#^\./([0-9]{4})([0-9]{2})([0-9]{2})(?:/.+)#\1/\2/\3#" <<< $1);\

এই (?:/.+)পথটিতে একটি পরবর্তী উপাদান রয়েছে তা নিশ্চিত করে, অতএব ফাইলগুলি যা পিতামহিত ডিরেক্টরিতে শিশু ছাড়াই কিছু উপেক্ষা করে।


@ klanomath regex101.com
grg

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