2012-06-25 10 views
89

पर परिणाम ढूंढने के लिए मैं एक कमांड काम करने की कोशिश कर रहा हूं जो 15 दिनों से अधिक पुरानी एसक्यूएल फाइलों को हटा देता है।कमांड लाइन: पाइपिंग परिणाम आरएम

खोज हिस्सा काम कर रहा है लेकिन आरएम नहीं है।

rm -f | find -L /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups -type f \(-name '*.sql' \) -mtime +15 

यह उन फ़ाइलों की एक सूची निकालता है जिन्हें मैं हटा देना चाहता हूं लेकिन उन्हें हटा नहीं रहा है। पथ सही हैं।

usage: rm [-f | -i] [-dIPRrvW] file ... 
     unlink file 
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120601.backup.sql 
... 
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120610.backup.sql 

मैं क्या गलत कर रहा हूं?

उत्तर

186

आप वास्तव में rmआउटपुटfind के इनपुट में पाइप कर रहे हैं। क्या आप चाहते हैं rm को findके रूप में तर्क के उत्पादन में उपयोग करने के लिए है:

find -type f -name '*.sql' -mtime +15 | xargs rm 

xargs आदेश है कि "रूपांतरित" एक अन्य कार्यक्रम के तर्कों में अपने मानक इनपुट, या, वे और अधिक सही उस पर डाल के रूप में मानक इनपुट से man पेज,

निर्माण और निष्पादित कमांड लाइन

ध्यान दें कि फ़ाइल नाम खाली स्थान के वर्ण हो सकते हैं, तो आप उस के लिए ठीक हो जानी चाहिए:

find -type f -name '*.sql' -mtime +15 -print0 | xargs -0 rm 

लेकिन वास्तव में, find इस के लिए एक शॉर्टकट है: -delete विकल्प:

find -type f -name '*.sql' -mtime +15 -delete 

कृपया के बारे में पता होना man find में चेतावनी निम्नलिखित:

Warnings: Don't forget that the find command line is evaluated 
    as an expression, so putting -delete first will make find try to 
    delete everything below the starting points you specified. When 
    testing a find command line that you later intend to use with 
    -delete, you should explicitly specify -depth in order to avoid 
    later surprises. Because -delete implies -depth, you cannot 
    usefully use -prune and -delete together. 

पी एस ध्यान दें कि सीधे rm पर पाइपिंग एक विकल्प नहीं है, क्योंकि rm मानक इनपुट पर फ़ाइल नामों की अपेक्षा नहीं करता है। वर्तमान में आप जो कर रहे हैं वह उन्हें पीछे की ओर पिप कर रहा है।

+1

धन्यवाद। मैंने मैन पेज को पढ़ा और उस ध्वज को एक कोशिश दी। मैं एक पूर्ण पथ पारित कर रहा हूं लेकिन वापस आ रहा हूं "/ usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups /: सापेक्ष पथ संभावित रूप से सुरक्षित नहीं है"। कोई विचार क्यों? – jerrygarciuh

+1

@ जेरीगारसिह एक नज़र डालें [यहां] (http://www.mail-archive.com/[email protected]/msg16944.html)। –

+0

धन्यवाद। मुझे यकीन नहीं है कि मैंने अच्छी तरह से पोस्ट का पालन किया था, लेकिन जब मैंने कमांड के अंत में अपना समाधान और डाल दिया-हटा दिया, तो उसने सभी समय की फाइलों को बिना किसी समय के हटा दिया ... लेकिन इसमें चेतावनी नहीं थी इसलिए मुझे लगता है यह प्रगति है ... – jerrygarciuh

19
find /usr/www/bar/htdocs -mtime +15 -exec rm {} \; 

/usr/www/bar/htdocs से अधिक उम्र के 15 दिनों में फ़ाइलों का चयन और उन्हें हटा देंगे।

0

locate कमांड का उपयोग करने के लिए एक और आसान तरीका है। इसे xargs का उपयोग करें।

उदाहरण के लिए,

locate file.txt | xargs rm 
locate *something* | xargs rm 
0

आप यह मानते हुए निर्देशिका * .sql बैकअप फ़ाइलों से युक्त में नहीं हैं:

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec rm -v {} \; 

ऊपर -v विकल्प उपयोगी है कहीं भी होगी verbosely उत्पादन जो फ़ाइलें हटाए जा रहे हैं क्योंकि उन्हें हटा दिया जा रहा है।

मुझे उन फ़ाइलों को सूचीबद्ध करना पसंद है जिन्हें पहले सुनिश्चित किया जाएगा। ईजी:

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec ls -lrth {} \;