উত্তর:
আপনি যদি ফাইলগুলি লুপ করতে চান তবে * কখনও ব্যবহার করবেন নাls
। tl; dr এমন অনেকগুলি পরিস্থিতি রয়েছে যেখানে আপনি ভুল ফাইল বা সমস্ত ফাইল মুছে ফেলতে চান।
এটি বলেছিল, দুর্ভাগ্যক্রমে বাশে সঠিকভাবে করা এটি একটি কৌতুকপূর্ণ কাজ। আমার এমনকি আরও পুরানো একটি সদৃশ প্রশ্নের একটি কার্যকরী উত্তর রয়েছে যা আপনি ছোট পরিবর্তনগুলির সাথে ব্যবহার করতে পারেন:find_date_sorted
counter=0
while IFS= read -r -d '' -u 9
do
let ++counter
if [[ counter -gt 3 ]]
then
path="${REPLY#* }" # Remove the modification time
echo -e "$path" # Test
# rm -v -- "$path" # Uncomment when you're sure it works
fi
done 9< <(find . -mindepth 1 -type f -printf '%TY-%Tm-%TdT%TH:%TM:%TS %p\0' | sort -rz) # Find and sort by date, newest first
* কোনও অপরাধ নেই - আমি আগেও ব্যবহার করতাম ls
। তবে এটি সত্যই নিরাপদ নয়।
সম্পাদনা: ইউনিট পরীক্ষা সহ নতুনfind_date_sorted
((++counter>3))
আপনার পরীক্ষা হিসাবে চেষ্টা করুন । এটি সুন্দরভাবে সংহত। অনলাইনারদের ক্ষেত্রে: যদি ব্রিভিটি কোনও উদ্বেগের সাথে কোনও ফাংশনে কোডটি গুটিয়ে রাখে, তবে এটি নিয়ে চিন্তা করবেন না।
একটি zsh গ্লোব ব্যবহার করে 3 টি নতুন ফাইল বাদে সমস্ত মুছতে, আপনি Om
ফাইলগুলি সর্বাধিক থেকে নতুনতে বাছাই করতে (ক্যাপিটাল ও) এবং আপনি চান ফাইলগুলি দখল করতে একটি সাবস্ক্রিপ্ট ব্যবহার করতে পারেন।
rm ./*(Om[1,-4])
# | |||| ` stop at the 4th to the last file (leaving out the 3 newest)
# | |||` start with first file (oldest in this case)
# | ||` subscript to pick one or a range of files
# | |` look at modified time
# | ` sort in descending order
# ` start by looking at all files
অন্যান্য উদাহরণ:
# delete oldest file (both do the same thing)
rm ./*(Om[1])
rm ./*(om[-1])
# delete oldest two files
rm ./*(Om[1,2])
# delete everything but the oldest file
rm ./*(om[1,-2])
এখন পর্যন্ত সবচেয়ে সহজ পদ্ধিতি হল zsh এবং এর গ্লোব কোয়ালিফায়ার ব্যবহার : Om
বয়সের কমিয়ে বাছাই করা (যার অর্থ প্রাচীনতম) এবং [1,3]
কেবল প্রথম তিনটি ম্যাচ ধরে রাখা।
rm ./*(Om[1,3])
আরও দেখুন আমি কিভাবে zsh একটি উল্লিখিত glob ফিল্টার না আরো উদাহরণ জন্য।
এবং l0b0 এর পরামর্শটি মনোযোগ দিন : আপনার কোডটির শেল বিশেষ অক্ষর রয়েছে এমন ফাইলগুলি থাকলে আপনার কোডটি ভয়াবহভাবে ভেঙে যাবে।
ডিরেক্টরিতে নতুনতম ফাইলটি পেতে আপনি নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন:
newest_in()
{
local newest=$1
for f;do [[ $f -nt $newest ]] && newest="$f"; done;
printf '%s\n' "$newest"
}
প্রতিটি পুনরাবৃত্তির পরে সর্বাধিক নতুন ফাইল বাদ দিয়ে এটিকে আলাদা আলাদা সেট দিন।
টিপ: যদি আপনি "$ {ফাইলগুলি [@]}" নামক অ্যারেতে ফাইলের প্রাথমিক সেটটি ধরে থাকেন তবে সন্ধান করা নতুনতম ফাইলের সূচী এবং unset 'files[index]'
পরবর্তী পুনরাবৃত্তির আগে সংরক্ষণ করুন।
ব্যবহার: newest_in [set of files/directories]
নমুনা আউটপুট:
[rany$] newest_in ./*
foo.txt
[rany$]
প্রথমত, -R
বিকল্পটি পুনরাবৃত্তির জন্য রয়েছে, যা সম্ভবত আপনি চান না - এটি সমস্ত উপ-ডিরেক্টরিতেও অনুসন্ধান করবে। দ্বিতীয়ত, <
অপারেটর (যখন পুনঃনির্দেশ হিসাবে দেখা হচ্ছে না) স্ট্রিং তুলনার জন্য। আপনি সম্ভবত চান -lt
। চেষ্টা করুন:
while [ `ls -1A | grep ^- | wc -l` -lt 3 ]
তবে আমি এখানে সন্ধান ব্যবহার করব:
while [ `find . -maxdepth 1 -type f -print | wc -l` -lt 3 ]
আমি জানি এটি পার্স করা পাপls
, তবে এটি কী:
find . -type f -maxdepth 1 | xargs ls -ltr | sed '1,3d' | awk '{print $9}' | xargs rm
5 টি খালি ফাইল সহ একটি দ্রুত পরীক্ষা:
$ >1
$ >2
$ >3
$ >4
$ >5
$ find . -type f -maxdepth 1 | xargs ls -lt | sed '1,3d' | awk '{print $9}' | xargs rm
$ ls -1
3
4
5
ls
আউটপুট পার্সিং করা find
এবং xargs
ভুল উপায়ে ব্যবহার এবং একসাথে। আপনি একত্রিত যদি find
এবং xargs
আমি তোমাদের ব্যবহার সুপারিশ find
গুলি -print0
এবং সেই অনুযায়ী xargs
গুলি -O
অপশন। বিষয় সম্পর্কে আরও তথ্যের জন্য অনুসন্ধান ব্যবহার করে সম্পর্কে পড়ুন । আপনি সম্ভবত একবার দেখে নিতে পারেন এবং কেন পার্সিং খুব খারাপ is
এই ওয়ান-লাইনারটি আমার মনে হয়:
ls -t1 /home/user/test | tail -n +4 | xargs -I{} rm -- "{}"
এখানে একটি সমাধান রয়েছে:
rm /appserver/webapplogs/$(ls -t1 /appserver/webapplogs/|tail -1)