2011-06-30 7 views
28

मुझे पता है कि यूनिक्स की ढूंढें आदेश के लिए इस विकल्प का है: है वहाँ मुझे फ़ाइलों को पुराने एक निश्चित फ़ाइल से हैं दूँगी कि एक विकल्पयूनिक्स खोज: -newer विकल्प मौजूद है के विपरीत?

find -version 
GNU find version 4.1 

    -newer file Compares the modification date of the found file with that of 
     the file given. This matches if someone has modified the found 
     file more recently than file. 

। मैं क्लीनअप के लिए निर्देशिका से सभी फाइलों को हटाना चाहता हूं। तो, एक विकल्प है, जहां मैं सभी फाइलों से अधिक उम्र N दिनों मिलेगा भी काम करना होगा।

उत्तर

32

आप इस तरह -newer आपरेशन नकारना करने के लिए एक ! उपयोग कर सकते हैं:

find . -mtime +7 

:

find . \! -newer filename 

आप फ़ाइलों है कि पिछले संशोधित किया गया था और अधिक तो 7 दिन पहले का उपयोग पता लगाना चाहते हैं अद्यतन:

फ़ाइल पर मिलान से बचने के लिए आप निम्न के उपयोग की तुलना कर रहे हैं:

find . \! -newer filename \! -samefile filename 
+1

यह ध्यान रखना महत्वपूर्ण है कि यह तर्क "बराबर या पुराना" होगा। इसलिए, इसमें पथ में संदर्भ फ़ाइल शामिल होगी। एक बेहतर समाधान के लिए नीचे मार्टी का जवाब देखें। – swdev

+0

मार्टी का जवाब परीक्षण फ़ाइल के समान नाम वाली फ़ाइलों के मिलान को भी रोक देगा। मैंने परीक्षण के साथ अपना जवाब अपडेट कर दिया है जिसमें फ़ाइल का परीक्षण किया जा रहा है। – qbert220

6

तुम बस निषेध का उपयोग कर सकते हैं:

find ... \! -newer <reference> 

तुम भी विकल्पों में से -mtime/-atime/-ctime/-Btime परिवार कोशिश कर सकते हैं। मैं तुरंत याद नहीं वे कैसे काम करते हैं, लेकिन वे इस स्थिति में उपयोगी हो सकता है।

एक find आपरेशन से फ़ाइलों को हटाने, विशेष रूप से एक रूट के रूप में चल रहा से सावधान रहें; तरीके एक ही सिस्टम पर एक से आम, दुर्भावनापूर्ण प्रक्रिया चीजें आप नष्ट कर दिया नहीं किया हटाकर में यह चाल कर सकते हैं की एक पूरी गुच्छा रहे हैं। मैं दृढ़ता से आप GNU find manual की पूरी "Deleting Files" खंड को पढ़ने की सलाह देते हैं।

2

कृपया ध्यान दें कि नए अर्थ है "बड़े या एक ही टाइमस्टैम्प" का निषेध:

आप इस उदाहरण में देख के रूप में, एक ही फाइल भी दिया जाता है:

[email protected]:/home/thomas/tmp/ touch test 
[email protected]:/home/thomas/tmp/ find ./ ! -newer test 
./test 
4

आप केवल वही फ़ाइलें की जरूरत है उस फ़ाइल "foo" से अधिक पुराने हैं और खुद foo नहीं, निषेध का उपयोग कर नाम से फ़ाइल को बाहर:

find . ! -newer foo ! -name foo 
1

दुर्भाग्य से, लगता है does not को इस समर्थन करते हैं! -नवीन का मतलब पुराना नहीं है। इसका मतलब केवल नए नहीं है, लेकिन यह उन फ़ाइलों से भी मेल खाता है जिनमें बराबर संशोधन समय है। इसलिए मैं

for f in path/files/etc/*; do 
    [ $f -ot reference_file ] && { 
     echo "$f is older" 
     # do something 
    } 
done 
संबंधित मुद्दे