প্যাটার্নের সাথে মেলে এমন সমস্ত ফাইল মুছে ফেলা কি একক আদেশে সম্ভব?
file_name_1294132_rest_of_file
rm \*(less than 1294132)\*
প্যাটার্নের সাথে মেলে এমন সমস্ত ফাইল মুছে ফেলা কি একক আদেশে সম্ভব?
file_name_1294132_rest_of_file
rm \*(less than 1294132)\*
উত্তর:
সবচেয়ে সহজ ক্ষেত্রে যেখানে আপনার কাছে ফাইল ফাইলের নাম রয়েছে যাতে নতুন লাইনের মতো অদ্ভুত অক্ষর নেই, আপনি কেবল এটি করতে পারেন:
rm "$(ls | gawk -F_ '$3<1294132')"
আপনার পার্সিং এড়ানো উচিত এমন বিভিন্ন কারণ রয়েছেls , সুতরাং এর চারপাশে এখানে একটি উপায় দেওয়া হয়েছে:
for f in file_*; do
printf %s "$f" | perl -anF_ -e 'unlink() if $F[2]<1294132';
done
file_nameপারে তবে তা মোকাবেলা করতে পারে না file_10_20_30_name। ওপি কখনই বলেনি যে _rest_of_fileএতে ডিজিট থাকতে পারে না। এছাড়াও রিডডির কলটি ওল্ড ফাইলগুলির মাধ্যমে সঠিক প্যাটার্ন, সাবডিয়ার ইত্যাদির সাথে মেলে না It
for i in লুপটি বেশিরভাগ জিনিস নিয়ে কাজ করে এবং প্রায় সব কিছুতেইwhile IFS= read -r -d $'\0' ডিল করতে পারে ।
আমি ইউএনআইএক্স / লিনাক্স ধরেছি কারণ "আরএম" কমান্ড রয়েছে।
সব ফাইল একই ডিরেক্টরিতে আছে? যদি তা না হয় তবে এটি জিনিসগুলিকে অনেক জটিল করে তোলে।
যদি সেগুলি হয় তবে আপনার সম্ভবত সম্ভবত একটি ডিরেক্টরিতে অনেকগুলি ফাইল রয়েছে এবং আপনার লেআউটটি সম্পর্কে ভাবা উচিত।
এটি কাজ করবে, যদিও ধীর হবে:
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
আপনি এমন একটি স্ক্রিপ্টও লিখতে পারেন যা ফাইলের নামকে উপাদানগুলিতে টোকিনাইজ করে, "গণনা" বের করে, তুলনা করে এবং তারপরে হয় ফাইলটি মুছে ফেলা বা পাস করে। তবে এটি সম্ভবত উপরের যে কোনওটির চেয়ে বেশি সময় নিবে।
আপনি এগুলিকে এক লাইনে রেখে দিতে পারেন (';' গুলি সহ) এবং এটিকে একটি আদেশ বলেছিলেন
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]'`
perl -e 'opendir(D, "."); foreach(readdir D) {/a_(\d+)_b/; print if $1 and $1<3;}'- যা অবশ্যই উন্নত করা যায় (এবং মুদ্রণের পরিবর্তে লিঙ্কে পরিবর্তিত হয়); আমার বক্তব্যটি হ'ল একবার আপনি বুঝতে পারছেন যে আপনি শেলের কোনও অংশই করতে চান না, সাধারণত শেলের মধ্যে কিছু না করা বা যতটা সম্ভব কম করা ভাল।