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


2

मैं .backup में समाप्त होने वाली सबसे हालिया फ़ाइल को देखने में सक्षम होना चाहता हूं, और उस फ़ाइल की तुलना में पुरानी सभी फ़ाइलों को हटाना (लेकिन निश्चित रूप से नई फ़ाइलें रखना)।

यहां एक निर्देशिका लिस्टिंग का एक उदाहरण है जहां आप कई बैकअप कर सकते हैं। मैं फ़ाइलों को रखने की इच्छा रखता हूँ 000000020000000000000083.00000020.backup और 000000010000000000000082

मैं इसे पूरा करने के लिए कई हैक तरीकों के बारे में सोच सकता हूं, जैसे कि समय के साथ एक खोज करना और एक दिन से अधिक पुराना हटाना, जो मेरे लिए काम कर सकता है, लेकिन नहीं सही बात । मैं निर्देशिका का एक सूचीकरण भी कर सकता हूं इससे पहले कि मैं अपना बैकअप करूं, फिर बाद में इसकी तुलना करें और उन सभी फाइलों को हटा दें जो पहले थीं। यह अभी भी सही नहीं है।

कोई विचार?

$ ls -ltr
total 131084
-rw-r-----. 1 cm800 cm800        0 May  6 13:58 archive_06_05_14___13_58_05
-rw-------. 1 cm800 cm800 16777216 May  6 13:58 00000001000000000000007F
-rw-------. 1 cm800 cm800 16777216 May  6 13:58 000000020000000000000080
-rw-------. 1 cm800 cm800 16777216 May  6 13:58 000000020000000000000081
-rw-------. 1 cm800 cm800      242 May  6 13:58 00000001000000000000007F.00000020.backup
-rw-------. 1 cm800 cm800      242 May  6 13:58 000000020000000000000081.00000020.backup
-rw-------. 1 cm800 cm800 16777216 May  6 14:03 000000010000000000000080
-rw-------. 1 cm800 cm800 16777216 May  6 14:06 000000020000000000000082
-rw-------. 1 cm800 cm800 16777216 May  6 14:06 000000010000000000000081
-rw-------. 1 cm800 cm800 16777216 May  6 14:07 000000020000000000000083
-rw-------. 1 cm800 cm800      242 May  6 14:07 000000020000000000000083.00000020.backup
-rw-------. 1 cm800 cm800 16777216 May  6 14:11 000000010000000000000082

जवाबों:


3

उपयोग -nt, -ot परिचालक यह जांचने के लिए कि कोई फ़ाइल नए / पुराने है या नहीं:

#! /bin/bash

# Find the newest backup file:
unset newest
for f in *.backup ; do
    [[ $newest ]] || newest=$f           # Initialize.
    [[ $f -nt $newest ]] && newest=$f    # Keep the newest so far.
done

# Delete all the older files:
for f in * ; do
    [[ $f -ot $newest ]] && rm "$f"
done

तुम भी अधिक कुशल छँटाई एल्गोरिदम पर विचार कर सकते हैं ... bashguru.com/2011/01/quicksort-shell-script.html
Eric G

@ एरिक: मैं छँटाई नहीं कर रहा हूँ। मैं न्यूनतम खोज रहा हूं। पूरी बात O (n) है।
choroba

यह मेरे लिए पूरी तरह से काम करता है। धन्यवाद!!!
AaronG

यह तब तक अच्छी तरह से काम करता है, जब तक कि आप किसी कारण से, अपने किसी एक वॉक आर्काइव (mv / cp / touch को जो भी ...) को संशोधित करते हैं और संशोधित समय बदल जाता है। आप खोज / हटाने के लिए फ़ाइल के नाम पर भरोसा कर सकते हैं - [[ "$f" < "$newest" ]]
csny
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.