X दिनों + से पुरानी फ़ाइलों को हटाएं


143

मुझे फ़ोल्डर में 5 दिनों से अधिक पुरानी फ़ाइलों को हटाने का आदेश मिला है

find /path/to/files* -mtime +5 -exec rm {} \;

लेकिन मैं उस फ़ोल्डर में उपनिर्देशिकाओं के लिए यह कैसे करूं?


क्या आपके पास उप निर्देशिकाओं के अंदर फाइलें हैं? या उप निर्देशिका खुद?
राहुल

3
find /path/to -type d -empty -delete
कोस्टा

2
उपनिर्देशिकाओं में फ़ाइलें हटाएं जो 5+ दिन पुरानी हैं
Teddy291

3
संभवत: मजेदार है जब मेरे पास रिक्त स्थान वाली फाइलें हैं। उदाहरण के लिए, "टेस्ट वन" और आरएम नामक एक फाइल खिलाया जाता है rm test one। (जो "परीक्षण" नामक एक फ़ाइल और "एक" नामक एक फ़ाइल को हटा देगा, लेकिन "परीक्षण एक" नामक फ़ाइल नहीं होगी)। सुझाव: -delete या -print0
Hennes

6
एक साइड नोट के रूप में, विशेष वर्ण वाले मुद्दों से बचने के लिए हमेशा दिए गए तर्क को उद्धृत करेंfind , जैसा कि उत्तर की पहली पंक्ति में बताया गया है। जैसे:find /path/to/files/ -exec somecommand '{}' \;
वाल्फ

जवाबों:


240

आरएम के लिए पाइपिंग करते समय विशेष फ़ाइल नामों (रिक्त स्थान, उद्धरण) के साथ सावधान रहें।

एक सुरक्षित विकल्प है - -प्लेट विकल्प:

find /path/to/directory/ -mindepth 1 -mtime +5 -delete

यही कारण है, कोई अलग से आरएम कॉल नहीं है और आपको फ़ाइल नामों के बारे में चिंता करने की आवश्यकता नहीं है।

इसे चलाने से पहले इस कमांड का परीक्षण करने के -deleteसाथ बदलें -depth -print( -deleteइसका अर्थ है -depth)।


23
इसके अलावा का उपयोग -type fकेवल फाइलों को डिलीट करना (और उप निर्देशिकाओं रखने के लिए)
ओलेग

3
वैकल्पिक रूप से, यदि आप पांच दिनों की तुलना में सभी फाइलों के लिए ऐसा ही करना चाहते हैं: पाएं / पाथ / टू / डाइरेक्टरी / -मिंडेप 1 -मैट -5
डिटेल

यदि मेरे पथ में रिक्त स्थान हैं तो मुझे यह कैसे करना चाहिए? find /path/to/dir\ with\ spaces/ -mindepth 1 -mtime +5 -delete?
पैट्रिक ग्रेगोरियो

3
@ uom-pgregorio मैं उद्धरणों में पथ डालने का सुझाव दूंगा।
एट्रिप्स

4
ध्यान दें कि प्रत्येक findतर्क एक फ़िल्टर है जो इनपुट के रूप में पिछले फ़िल्टर के परिणाम का उपयोग करता है। इसलिए सुनिश्चित करें कि आप अंतिम तर्क के रूप में -delete जोड़ें। IE: find . -delete -mtime +5वर्तमान पथ में हर कोई हटा देगा।
जोहान

15

ध्यान दें कि यह कमांड तब काम नहीं करेगी जब यह बहुत सारी फाइलें ढूंढ ले। यह एक त्रुटि देगा जैसे:

bash: /usr/bin/find: Argument list too long

मतलब कमांड लाइन की लंबाई पर निष्पादित सिस्टम कॉल की सीमा पार हो गई थी। आरएम निष्पादित करने के बजाय इस तरह से यह xargs का उपयोग करने के लिए बहुत अधिक कुशल है । यहाँ एक उदाहरण है कि काम करता है:

find /root/Maildir/ -mindepth 1 -type f -mtime +14 | xargs rm

यह सभी फाइलों (टाइप एफ) को 14 दिन पहले संशोधित / रूट / मेल्डिर / पुनरावर्ती रूप से वहां से और गहरी (माइंडफेथ 1) से हटा देगा। अधिक विकल्पों के लिए खोज पुस्तिका देखें


7
AskUbuntu ( askubuntu.com/questions/589210/removing-files-older-than-7-day ) पर @ AfshinHamedi के उत्तर के अनुसार, नई वर्णमाला और विशेष वर्ण वाली फ़ाइलों से सावधान रहें। इसके बजाय का उपयोग करेंfind /root/Maildir/ -mindepth 1 -type f -mtime +14 -print0 | xargs -r0 rm --
Cbhihe

2
या सिर्फ '+' को खोज परिणामों में जोड़ें
Dani_l

8

यह ऐसा ही है। आपको बस फ़ाइलों के उपसर्ग के बजाय मूल निर्देशिका प्रदान करनी होगी। आपके उदाहरण में, यह होगा:

find /path/to -type f -mtime +5 -exec rm {} \;

यह 5 दिनों से अधिक पुरानी सभी फ़ाइलों को हटा देगा जो कि /path/toइसके उप-निर्देशिकाओं के अंतर्गत हैं ।

खाली उप-निर्देशिकाओं को हटाने के लिए, ऊपर @Costas टिप्पणी देखें।


4
ध्यान दें कि प्रत्येक और प्रत्येक फ़ाइल के लिए आप rm कमांड निष्पादित करेंगे। यदि आपके पास 1000 फाइलें 5 दिनों से अधिक पुरानी हैं, तो rm 1000 बार शुरू हो जाएगा। इस कारण से कोस्टा की टिप्पणी के रूप में -delete विकल्प पर विचार करें -exec rm {} \ +
Hennes

@ हेंनेस: - 1) निश्चित नहीं है कि आपको +उस मामले में भागने की जरूरत है । - 2) -exec rm '{}' +उनके नाम पर विशेष पात्रों (रिक्त स्थान, नई सूची, आदि ...) के साथ फ़ाइलों की बुराई को रोकने के लिए लिखना बेहतर है ।
Cbhihe

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