ফাইলগুলি মোছার সময় নির্দিষ্ট ফাইল এবং ডিরেক্টরি বাদ দিয়ে


11

আমার শীর্ষ স্তরের ডিরেক্টরি হ'ল datadataবেশ কয়েকটি ডিরেক্টরি অন্তর্ভুক্ত এবং এই ডিরেক্টরিগুলির উপ-ডিরেক্টরি রয়েছে। data/কিছু ডিরেক্টরিতে বিভিন্ন ফাইল বাদে আমার ভিতরে সমস্ত ফাইল এবং ডিরেক্টরিগুলি সরিয়ে ফেলতে হবে ।

উদাহরণস্বরূপ, ডেটা ডিরেক্টরি 100এবং অন্তর্ভুক্ত 101। আমি শুধু রাখতে চান a.txtএবং b.txtফাইল 100/এবং c.txtএবং d.txtফাইল 101/যখন সব অন্যান্য ফাইল ও ডিরেক্টরিগুলি সরানোর 100এবং 101

উদাহরণ:

.
├── 100
   ├── a.txt
   ├── b.txt
   ├── c.txt
   └── d.txt
└── 101
    ├── a.txt
    ├── b.txt
    ├── c.txt
    └── d.txt

আমি rm -rf !(a.txt|b.txt)কমান্ডটি ব্যবহার করি তবে আমি প্রতিটি আদেশের জন্য স্বয়ংক্রিয়ভাবে এই আদেশটি প্রয়োগ করতে পারি না।

উত্তর:


12

আপনি ইতিমধ্যে খুঁজে পেয়েছেন যে extglobবৈশিষ্ট্য যা সক্ষম করা হয়েছে তা ব্যবহার করতে পারেন :

shopt -s extglob

এটি মিলগুলি বাদ দিতে দেয় যাতে আপনি যেমন কাজ করতে পারেন:

rm 100/!([ab].txt) 101/!([cd].txt)

echoপ্রথমে এটি পরীক্ষা করা ভাল ধারণা । এই উদাহরণটি এমন কোনও কিছুর সাথে মিলবে 100/যা ভিতরে নেই a.txtবা যা b.txtকিছু ভিতরে 101/নেই c.txtবা নেই d.txt। যদি একই নিয়মের ক্ষেত্রেও 100/প্রযোজ্য হয় তবে 102/আপনি এটি করতে পারেন:

10[02]/!([ab].txt) # or
{100,102}/!([ab].txt)

আমি কেবল 100 এবং 101 ডিরেক্টরিগুলির জন্য উদাহরণ দিয়েছি তবে বাস্তবে উপ-ডিরেক্টরিগুলির সংখ্যা প্রায় 20। মূল ফোল্ডারে প্রতিটি ডিরেক্টরি নাম না লিখে প্রতিটি ডিরেক্টরিতে উপরের কোডটি প্রয়োগ করার কোনও উপায় আছে কি?
deepblue

@ প্রদীপলু দয়া করে আপনার প্রশ্নের ( সম্পাদনা ) ক্ষেত্রে এর জন্য একটি নিখুঁত উদাহরণ সরবরাহ করুন , এটি নির্দিষ্ট করে না rmআপনি কী উল্লেখ করতে চান তবে কোন ফাইলটি কোন ডিরেক্টরিতে রাখতে হবে তা যদি বিশেষভাবে অস্পষ্ট হয় তবে তা স্পষ্ট নয় ।
মিষ্টান্ন

7

আপনি findএই জন্য ব্যবহার করতে পারে । আপনি পরীক্ষাগুলির findসাথে -notবা এড়িয়ে যেতে পারেন !। এটি ম্যাচগুলি সন্ধান করার পরিবর্তে বাদ দেবে।

আপনি যে ফাইলগুলি রাখতে চান তার যে কোনও প্রধান ডিরেক্টরিকে বিশেষত বর্তমান ডিরেক্টরিটি মুছে না ফেলতে আপনার সতর্ক হওয়া উচিত ., সুতরাং মুছে ফেলার আগে আউটপুটটি পুরোপুরি পড়েছেন কিনা তা নিশ্চিত হয়ে নিন।

আপনার উদাহরণের ভিত্তিতে আপনি dataডিরেক্টরি থেকে এই জাতীয় কিছু করতে পারেন ।

find ! -path . ! -path ./100 ! -path ./101 ! -path "./100/[ab].txt" ! -path "./101/[cd].txt"

! -path ./path/to/dirআপনি মুছে ফেলা এড়াতে চান যে কোনও পথের জন্য একটি যুক্ত করুন । আপনি যেমন মেটাচার্যাক্টর ব্যবহার করতে পারেন *তবে নিশ্চিত করুন যে আপনি যদি "./path*dir"কোনও অযাচিত বিস্তৃতি রোধ করতে উদ্বোধন করেন তবে উদাহরণস্বরূপ ।

findডিফল্টভাবে পুনরাবৃত্ত হয়। এমনকি যদি আমরা ./100এখানে না পাই তবে আমরা এর সমস্ত বিষয়বস্তুগুলি প্যাটার্নের সাথে মেলে না যদি না খুঁজে পাই [ab].txt। আপনি রাখতে চান এমন সমস্ত নাম যদি আপনি মেলে না করতে পারেন তবে অন্য পরীক্ষা যুক্ত করুন:

! -path "./100/[ab].txt" ! -path ./100/foo

এই পাবেন না a.txtবা b.txtবা foo, কিন্তু এটি সকল অন্যান্য ফাইল পাবেন।

আপনি যখন নিশ্চিত হন যে আপনি যা চান তা দেখতে পান, আপনি -deleteপাওয়া ফাইলগুলি মুছতে শেষ পর্যন্ত যুক্ত করতে পারেন :

find ! -path . ! -path ./100 ! -path ./101 ! -path "./100/[ab].txt" ! -path "./101/[cd].txt" -delete
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.