कमांड लाइन: पाइपिंग rm के लिए परिणाम ढूंढते हैं


140

मैं एक कमांड को काम करने की कोशिश कर रहा हूं, जो 15 दिनों से अधिक पुरानी SQL फ़ाइलों को हटा देता है।

खोज भाग काम कर रहा है, लेकिन आरएम नहीं।

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

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

जवाबों:


274

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

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
@jerrygarciuh यहाँ एक नज़र रखना ।
लेव लेवित्स्की

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

1
@jerrygarciuh Ouch, मुझे आशा है कि मूल्यवान कुछ भी नहीं खो गया था ... manकहते हैं: 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.मुझे यकीन नहीं है कि इस मामले में आपके द्वारा उपयोग किए गए अन्य विकल्प कैसे दिए जाएंगे, लेकिन क्या आपने कोशिश की?
लेव लेवित्स्की

नहीं, लेकिन मैं कुछ भी नहीं खो गया था। ये फाइलें एक अन्य सर्वर से rsync-ed हैं जहां वे भी संग्रहीत हैं।
जरगरिसुह

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

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


मैं "उत्तर नाम में स्थान" के कारण स्वीकार किए गए आपके उत्तर को पसंद करता हूं। यह पाइप की तुलना में "-exec" कमांड के साथ बेहतर है। धन्यवाद।
स्लिम अलाउ

3

locateकमांड का उपयोग करने के लिए एक और सरल विधि है । फिर, परिणाम को पाइप करें xargs

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

locate file | xargs rm

2

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

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

उपरोक्त -v विकल्प आसान है, यह मौखिक रूप से आउटपुट होगा कि कौन सी फाइलें हटाई जा रही हैं।

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

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec ls -lrth {} \;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.