পুরানো ফাইলগুলি সরিয়ে দিন


9

আমি ডিরেক্টরি থেকে পুরানো ফাইলগুলি মুছতে চাইছি এবং কেবলমাত্র 3 টি নতুন ফাইল রেখে চলেছি।

cd /home/user1/test

while [ `ls -lAR | grep ^- | wc -l` < 3 ] ; do

    rm `ls -t1 /home/user/test | tail -1`
    echo " - - - "

done

শর্তাধীন বিবৃতিতে কিছু ভুল।

উত্তর:


9

আপনি যদি ফাইলগুলি লুপ করতে চান তবে * কখনও ব্যবহার করবেন না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


আমি এলএস কে পার্সিং না করার বিষয়ে দ্বিতীয় অংশ। এছাড়াও স্ক্রিপ্টটি ঝরঝরে তবে আমি মনে করি এটি একটি লাইনারে করা যেতে পারে, আমাকে চেক করতে দিন ...
রহমু

ঠিক আছে, আপনি সবসময় বাশ
কোডকে

2
আমি যদি @ পিটার.ও এর কাছ থেকে নির্দয়ভাবে কোনও ধারণা চুরি করতে পারি তবে ((++counter>3))আপনার পরীক্ষা হিসাবে চেষ্টা করুন । এটি সুন্দরভাবে সংহত। অনলাইনারদের ক্ষেত্রে: যদি ব্রিভিটি কোনও উদ্বেগের সাথে কোনও ফাংশনে কোডটি গুটিয়ে রাখে, তবে এটি নিয়ে চিন্তা করবেন না।
Sorpigal

@ সরপিজাল ঝরঝরে শর্টকাট
l0b0

5

একটি 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])

5

এখন পর্যন্ত সবচেয়ে সহজ পদ্ধিতি হল zsh এবং এর গ্লোব কোয়ালিফায়ার ব্যবহার : Omবয়সের কমিয়ে বাছাই করা (যার অর্থ প্রাচীনতম) এবং [1,3]কেবল প্রথম তিনটি ম্যাচ ধরে রাখা।

rm ./*(Om[1,3])

আরও দেখুন আমি কিভাবে zsh একটি উল্লিখিত glob ফিল্টার না আরো উদাহরণ জন্য।

এবং l0b0 এর পরামর্শটি মনোযোগ দিন : আপনার কোডটির শেল বিশেষ অক্ষর রয়েছে এমন ফাইলগুলি থাকলে আপনার কোডটি ভয়াবহভাবে ভেঙে যাবে।


ওয়াও ওয়া ট্রেন ধরে রেখেছে, এটি কি 1 লাইনে সত্যিই একটি সম্পূর্ণ সমাধান?
মেটাগুরু

2
@ রায়ান এটি আপনার জন্য zsh
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

1

ডিরেক্টরিতে নতুনতম ফাইলটি পেতে আপনি নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন:

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$]

-1

প্রথমত, -Rবিকল্পটি পুনরাবৃত্তির জন্য রয়েছে, যা সম্ভবত আপনি চান না - এটি সমস্ত উপ-ডিরেক্টরিতেও অনুসন্ধান করবে। দ্বিতীয়ত, <অপারেটর (যখন পুনঃনির্দেশ হিসাবে দেখা হচ্ছে না) স্ট্রিং তুলনার জন্য। আপনি সম্ভবত চান -lt। চেষ্টা করুন:

while [ `ls -1A | grep ^- | wc -l` -lt 3 ]

তবে আমি এখানে সন্ধান ব্যবহার করব:

while [ `find . -maxdepth 1 -type f -print | wc -l` -lt 3 ]

দু'জনেই ব্যর্থ হবে যদি এক বা একাধিক ফাইলের নামের একটিতে '$ \ n' থাকে।
রানি আলবেগ ওয়াইন

-1

আমি জানি এটি পার্স করা পাপ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
র্যানি আলবেগ ওয়েইন

-2

এই ওয়ান-লাইনারটি আমার মনে হয়:

ls -t1 /home/user/test | tail -n +4 | xargs -I{} rm -- "{}"

ls ফাইলের তথ্য ইন্টারেক্টিভভাবে দেখার জন্য একটি সরঞ্জাম। এর আউটপুট মানুষের জন্য ফর্ম্যাট করা হয়েছে এবং স্ক্রিপ্টগুলিতে বাগ তৈরি করবে। গ্লোব ব্যবহার করুন বা তার পরিবর্তে সন্ধান করুন। কেন বুঝতে হবে: mywiki.wooledge.org/ পার্সিংএলস
র্যানি আলবেগ ওয়েইন

-2

এখানে একটি সমাধান রয়েছে:

rm /appserver/webapplogs/$(ls -t1 /appserver/webapplogs/|tail -1)

1
@ বাকবাক এলএস ফাইলের তথ্য ইন্টারেক্টিভভাবে দেখার জন্য একটি সরঞ্জাম। এর আউটপুট মানুষের জন্য ফর্ম্যাট করা হয়েছে এবং স্ক্রিপ্টগুলিতে বাগ তৈরি করবে। কেন বুঝতে এখানে দেখুন । নির্দিষ্টভাবে আপনার উত্তর সম্পর্কে কথা বলা - এক বা একাধিক ফাইলের একটি $ '\ n' অক্ষর থাকলে এইটি ভেঙে যাবে। এছাড়াও, কমান্ড সাবস্টিটিউশন (যেমন $ (...)) এর দ্বি-কোটের অভাব রয়েছে যা আরও একটি গুরুত্বপূর্ণ বিষয় নিয়ে আসে - ওয়ার্ড স্প্লিটিং !
রানি আলবেগ ওয়েইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.