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


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.