X এর চেয়ে কম সমস্ত ফাইল মুছার উপায় আছে কি?


0

প্যাটার্নের সাথে মেলে এমন সমস্ত ফাইল মুছে ফেলা কি একক আদেশে সম্ভব?

file_name_1294132_rest_of_file

rm \*(less than 1294132)\*

উত্তর:


2

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

rm "$(ls | gawk -F_ '$3<1294132')"

আপনার পার্সিং এড়ানো উচিত এমন বিভিন্ন কারণ রয়েছেls , সুতরাং এর চারপাশে এখানে একটি উপায় দেওয়া হয়েছে:

for f in file_*; do 
   printf %s "$f" | perl -anF_ -e 'unlink() if $F[2]<1294132'; 
done

আমি যুক্ত করব যে প্রতি ফাইলের জন্য আপনাকে একবার পার্ল কল করার দরকার নেই, এবং এটি বিকৃত জিনিসগুলি ধরার জন্য আরও কিছুটা প্রতিরক্ষামূলক হওয়া উচিত (যেমন "ফাইল_নাম" নামে একটি ফাইল)। আমার মাথার উপরের অংশটি ছেড়ে, আমি সাথে যাব perl -e 'opendir(D, "."); foreach(readdir D) {/a_(\d+)_b/; print if $1 and $1<3;}'- যা অবশ্যই উন্নত করা যায় (এবং মুদ্রণের পরিবর্তে লিঙ্কে পরিবর্তিত হয়); আমার বক্তব্যটি হ'ল একবার আপনি বুঝতে পারছেন যে আপনি শেলের কোনও অংশই করতে চান না, সাধারণত শেলের মধ্যে কিছু না করা বা যতটা সম্ভব কম করা ভাল।
গ্যাবে

@ গ্যাবে আমি পার্লের পুরো কাজটি করতে চাইনি যেহেতু আমি জানি না যে ওপি এটি জানে কিনা। আমি আরও ধরে নিয়েছি যে ওপি তাদের ফাইলগুলির ফর্ম্যাটটি জানে এবং আগ্রহের সংখ্যাটি সর্বদা 3 ডি ক্ষেত্র। আপনার পার্ল লুপটি যখন ডিল করতে file_nameপারে তবে তা মোকাবেলা করতে পারে না file_10_20_30_name। ওপি কখনই বলেনি যে _rest_of_fileএতে ডিজিট থাকতে পারে না। এছাড়াও রিডডির কলটি ওল্ড ফাইলগুলির মাধ্যমে সঠিক প্যাটার্ন, সাবডিয়ার ইত্যাদির সাথে মেলে না It
টেরডন

@Terdon আপনি যা বলবেন তার সাথে আমি সম্মত। আমি কেবল শেলটি শক্তিশালী বলে চিহ্নিত করতে বাধ্য বোধ করি, তবে বাস্তবে "শেলটি ব্যবহার করা" এর অর্থ সাধারণত "একাধিক স্বতন্ত্র ইউটিলিটি একসাথে পাইপিং" করা, এটি প্রতিরক্ষামূলক হওয়া কঠিন, নিরাপদ হওয়াও বেশ অসম্ভব; অতএব, একজনের হাতে আরও একটি সম্পূর্ণ স্ক্রিপ্টিং ভাষা শিখতে হবে এবং এতে স্যুইচিংয়ের ব্যাপারে লজ্জা পাবে না। যা আমি নিশ্চিত যে আপনি এর সাথে একমত হবেন।
গাবে

@ গাবে একেবারে, আমি পার্লের বেশিরভাগ জিনিস করার প্রবণতা রাখি। তবে শেলটি আসলে অবিশ্বাস্যরকম শক্তিশালী এবং for i in লুপটি বেশিরভাগ জিনিস নিয়ে কাজ করে এবং প্রায় সব কিছুতেইwhile IFS= read -r -d $'\0' ডিল করতে পারে ।
টেরডন

1

আমি ইউএনআইএক্স / লিনাক্স ধরেছি কারণ "আরএম" কমান্ড রয়েছে।

সব ফাইল একই ডিরেক্টরিতে আছে? যদি তা না হয় তবে এটি জিনিসগুলিকে অনেক জটিল করে তোলে।

যদি সেগুলি হয় তবে আপনার সম্ভবত সম্ভবত একটি ডিরেক্টরিতে অনেকগুলি ফাইল রয়েছে এবং আপনার লেআউটটি সম্পর্কে ভাবা উচিত।

এটি কাজ করবে, যদিও ধীর হবে:

seq 1 1294131 | xargs -i{} echo rm file_name_{}_rest_of_file

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

rm file_name_[1-9]_rest_of_file
rm file_name_[1-9][0-9]_rest_of_file
rm file_name_[1-9][0-9][0-9]_rest_of_file
rm file_name_[1-9][0-9][0-9][0-9]_rest_of_file

ইত্যাদি যতক্ষণ না আপনার শেল কমান্ড লাইনের দৈর্ঘ্যের বিষয়ে অভিযোগ করে।

আরেকটি দ্রুত এবং নোংরা হ'ল:

find . -name 'file_name_*_rest_of_file' | sort -n > /tmp/files.txt

মুছে ফেলা উচিত নয় এমন ফাইলগুলি সরাতে file.txt সম্পাদনা করুন

< /tmp/files/txt xargs rm

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


1

আপনি এগুলিকে এক লাইনে রেখে দিতে পারেন (';' গুলি সহ) এবং এটিকে একটি আদেশ বলেছিলেন

for f in file_name_*_rest_of_file
do 
   n=${f//[^0-9]}
  if [[ -n $n && $n -lt 22 ]]
  then
    echo del $f
  fi
done

এটি কিছুটা দীর্ঘ

for f in file_name_*_rest_of_file;do; n=${f//[^0-9]}; if [[ -n $n && $n -lt 22 ]]; then echo del $f; fi;done

$ {f // [^ 0-9]। একটি বাশিজম, এবং এটি দিয়েও করা যেতে পারে

nn=${f#file_name_}
n=${nn%_rest_of_file}

অথবা

n=`echo $f | tr -C -d '[0-9]'`
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.