विशिष्ट फ़ाइल की तुलना में पुरानी फ़ाइलें हटाएं


14

मुझे एक फ़ोल्डर से एक विशिष्ट फ़ाइल से पुरानी सभी फ़ाइलों को हटाने की आवश्यकता है।
CentOS 7 पर रनिंग बैश।

मेरे पास इसके लिए एक समाधान है, लेकिन मुझे लगता है कि इसे और अधिक सुरुचिपूर्ण तरीके से करना चाहिए:

reference_file=/my/reference/file

get_modify_time()
{
    stat $1 | grep -Po "Modify: \K[0-9- :]*"
}

pit=$(get_modify_time $reference_file)
for f in /folder/0000* ; do [[ "$pit" > "$(get_modify_time $f)" ]] && rm $f ; done

जवाबों:


28

मैंने इसे आज़माया नहीं है, लेकिन findपूरे ऑपरेशन को ठीक करने में सक्षम होना चाहिए:

$ find dir/ -type f ! -newer reference -delete

... और ...

$ find dir/ -type f ! -newer reference ! -name reference -delete

मूल रूप से:

  • ! -newer referenceउन फ़ाइलों से मेल खाता है जिन्हें हाल ही में संशोधित किया गया है reference।
  • -delete उन्हें हटा देता है।
  • ! -name referenceबाहर रखा गया है reference, अगर यह भी स्थित है dir/और आप इसे रखना चाहते हैं।

इससे पुरानी सभी फ़ाइलें हटा दी जानी चाहिए reference, और इसके नीचे स्थित होना चाहिए dir/।


2
उत्तम :)। बस -maxdepth 1खोज को पुनरावर्ती नहीं रखने के लिए जोड़ा गया
— सीएसआई

3
! -newerका अर्थ है "नया नहीं", इसलिए "बड़ी या समान आयु "; यदि पथ में findदिखता है, तो फ़ाइल को मिलान किया जाएगा , बस कुछ ध्यान में रखना है।
— फेरादा

1
@ferada यह नहीं होगा यदि आप इसे बाहर करते हैं, यही कारण है कि मेरे जवाब में यह भी शामिल है ! -name reference(तीसरी गोली देखें)।
— जॉन डब्ल्यूएच स्मिथ

7

साथ फ़ाइल संशोधन बार की तुलना test, का उपयोग करते हुए -nt(से नवीन) और -ot(से अधिक उम्र के) ऑपरेटरों:

if [ "$file1" -ot "$file2" ]; then
    #do whatever you want;
fi

2
धन्यवाद, यह मेरे समाधान से बेहतर है, लेकिन आपको अभी भी फ़ोल्डर में सभी फ़ाइलों को पुनरावृत्त करने और तुलना करने की आवश्यकता है ... अन्य उत्तर और भी सुंदर है
— csny
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.