कुछ निश्चित आकार की फ़ाइलों को हटाएं


12

मैं उन फ़ाइलों को हटाना चाहता हूं जिनका आकार कुछ मूल्यों के बीच है। उदाहरण के लिए मेरे पास फाइलों की निम्नलिखित सूची है:

-rw-r--r-- 1 smsc sys  558 Apr 30 13:07 stats.sfe.1.20120430130513.xml.Z
-rw-r--r-- 1 smsc sys  388 Apr 30 15:32 stats.sfe.1.20120430153013.xml.Z
-rw-r--r-- 1 smsc sys  386 Apr 30 15:36 stats.sfe.1.20120430153513.xml.Z
-rw-r--r-- 1 smsc sys  389 Apr 30 15:42 stats.sfe.1.20120430154013.xml.Z
-rw-r--r-- 1 smsc sys  390 Apr 30 16:02 stats.sfe.1.20120430160013.xml.Z
-rw-r--r-- 1 smsc sys  385 Apr 30 16:12 stats.sfe.1.20120430161013.xml.Z

उपरोक्त सूची से, मैं केवल उन फ़ाइलों को हटाना चाहता हूं जिनका आकार 386b और 390b के बीच भिन्न होता है । मुझे पता है कि मैं उन फ़ाइलों को हटाने के लिए निम्न आदेश का उपयोग कर सकता हूं, जिनका आकार निश्चित से अधिक है <size>:

find . -size +<size>-delete

लेकिन मैं उन फ़ाइलों के लिए एक और सीमा कैसे जोड़ सकता हूं जिनका आकार किसी दिए गए मूल्य से कम है?


4
findपरिस्थितियाँ तार्किक रूप से और डिफ़ॉल्ट रूप से होती हैं, इसलिए बस दूसरे -sizeविकल्प के लिए अन्य बाध्यता से निपटें ।
jw013

@ jw013 महान! ये मेरे लिए सही है। धन्यवाद! कृपया इसे अपने उत्तर के रूप में पोस्ट करें और मैं इसे स्वीकार करूंगा।
यूजीन एस

जवाबों:


7

एक सीमा बस एक ऊपरी बाउंड और एक कम बाउंड है। से findकल्पना :

अभिव्यक्ति [-ए] अभिव्यक्ति

प्राइमरी का संयोजन; और ऑपरेटर को दो प्राइमरी के जूसेटैप द्वारा निहित किया गया है या वैकल्पिक -a ऑपरेटर द्वारा स्पष्ट किया गया है। पहली अभिव्यक्ति झूठी होने पर दूसरी अभिव्यक्ति का मूल्यांकन नहीं किया जाएगा।

इसलिए आपको केवल -deleteकार्रवाई करने से पहले दोनों आकार सीमा निर्दिष्ट करने की आवश्यकता है ।


8

-aएक स्पष्ट में ANDऑपरेटर है कि आप दो प्राइमरी एकत्रित होना करने के लिए अनुमति देता है। इस मामले में एक सीमा का उपयोग कर बना -size

find . -size +386b -a -size -390b -exec rm -f {} \;

ध्यान दें कि आकार एक संख्यात्मक तर्क है जिसे वैकल्पिक रूप से +और साथ रखा जा सकता है -। से man 1 find:

   Numeric arguments can be specified as

   +n     for greater than n,
   -n     for less than n,
    n      for exactly n.

आपके उत्तर के लिए धन्यवाद। हालांकि, जैसा कि @ jw013 ने अपनी टिप्पणी में उल्लेख किया है, findपरिस्थितियां तार्किक रूप से और डिफ़ॉल्ट रूप से होती हैं। इसलिए मैंने सिर्फ एक और sizeशर्त जोड़ी और यह ठीक काम कर गई! अंतिम आदेश इस तरह दिखता है:find . -maxdepth 1 -size +358c -size -395c -delete
यूजीन एस

7

जब भी findकिसी संख्या की अपेक्षा की जाती है, तो आप +इस संख्या से अधिक मतलब के लिए एक संकेत रख सकते हैं , या -इस संख्या से कम होने का मतलब है। ये सख्त असमानताएं हैं: +3और -7इसका मतलब 4, 5 या 6 है।

-sizeप्राथमिक के साथ , आपको cयह इंगित करने के लिए प्रत्यय जोड़ने की आवश्यकता है कि संख्या कई बाइट्स है। आप अपने संयोजन (कुछ संस्करणों में, आप डाल सकते हैं -aया -andउनके बीच) लेने के लिए कई प्राइमरी को संक्षिप्त कर सकते हैं । इस प्रकार:

find . -size +385c -size -391c -delete

Zsh में, आप L ग्लोब क्वालिफायर का उपयोग कर सकते हैं । डिफ़ॉल्ट इकाई बाइट्स है; जैसे find, पात्र +और -सख्त असमानताएँ।

rm *(L+385-391)

(उपर्युक्त कमांड उपनिर्देशिकाओं में पुनरावृत्ति नहीं करता है; यदि आपको इसकी आवश्यकता है, **/तो पैटर्न से पहले जोड़ें ।)


मैं +3 और -7 को 4, 5 या 6 के बराबर नहीं समझता। क्या आप समझा सकते हैं?
हाशिम

1

उपयोग करने का एक तरीका perl:

perl -e '
    for ( @ARGV ) { 
        if ( -s >= 386 && -s _ <= 390 ) { 
            unlink $_ or printf qq[%s\n], qq[Could not delete $_: $!] 
        } 
    }
' *

आपके उत्तर के लिए धन्यवाद! क्या कोड के इस हिस्से को एकल पंक्ति के रूप में दर्ज किया जाना चाहिए?
यूजीन एस

@ यूजीनस: हाँ। इसे अपनी कमांड लाइन में चिपकाने का काम करना चाहिए-या सभी लाइनों को एक में जोड़ना है।
बिरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.