2014-07-01 2 views
5

मैं .foo में समाप्त होने वाली सभी फ़ाइलों को दोबारा कैसे हटा सकता हूं जिसमें एक ही नाम की एक भाई फ़ाइल है लेकिन .bar में समाप्त हो रही है? इस उदाहरण file.foo, file3.foo मेंसंबंधित "* .bar" फ़ाइलों के साथ सभी "* .foo" फ़ाइलों को दोबारा हटाकर

. 
├── dir 
│   ├── dir 
│   │   ├── file4.bar 
│   │   ├── file4.foo 
│   │   └── file5.foo 
│   ├── file2.foo 
│   ├── file3.bar 
│   └── file3.foo 
├── file1.bar 
└── file1.foo 

, और file4.foo देखते हैं के बाद से हटा दिया जाएगा file{1,3,4}.bar फ़ाइलों भाई: उदाहरण के लिए, निम्नलिखित निर्देशिका वृक्ष पर विचार करें। file{2,5}.foo इस परिणाम छोड़ने अकेला छोड़ दिया जाना चाहिए:

. 
├── dir 
│   ├── dir 
│   │   ├── file4.bar 
│   │   └── file5.foo 
│   ├── file2.foo 
│   ├── file3.bar 
└── file1.bar 
+3

+1 एक अच्छी तरह से सचित्र प्रश्न के लिए +1। – shellter

+0

और मौजूदा के लिए 'पेड़' के लिए धन्यवाद। : पी http://linux.die.net/man/1/tree – KPthunder

उत्तर

6

पहले एक बैकअप लेने के लिए इससे पहले कि आप इस find और rm आदेश की कोशिश याद रखें।

उपयोग इस find:

find . -name "*.foo" -execdir bash -c '[[ -f "${1%.*}.bar" ]] && rm "$1"' - '{}' \; 
+1

अच्छी तरह से किया गया! 'Xargs' के प्रदर्शन से मेल खाने के लिए ओपी के लिए सिर्फ एक नोट समानांतर में फ़ाइलों को संसाधित करने के लिए '+' नोटेशन का उपयोग कर सकता है। –

+0

+1 मुझे '$ {1%। *} नहीं समझ रहा है 'मैं चारों ओर खेल रहा था और' $ {1%}' एक्सटेंशन वापस कर देगा। मैं इसके बारे में और कहां से पता लगा सकता हूं? – Tiago

+0

@ टियागो: धन्यवाद कि आप 'पैरामीटर 'अनुभाग में' पैरामीटर विस्तार 'अनुभाग के अंतर्गत देख सकते हैं। – anubhava

2
while IFS= read -r FILE; do 
    rm -f "${FILE%.bar}".foo 
done < <(exec find -type f -name '*.bar') 

या

find -type f -name '*.bar' | sed -e 's|.bar$|.foo|' | xargs rm -f 
1

bash 4,0 और बाद में, और zsh में:

shopt -s globstar # Only needed by bash 
for f in **/*.foo; do 
    [[ -f ${f%.foo}.bar ]] && rm ./"$f" 
done 

में 10, आप एक चुनिंदा पैटर्न को परिभाषित कर सकते हैं जो .foo में समाप्त होने वाली फ़ाइलों से मेल खाता है, यदि संबंधित .bar फ़ाइल है, तो rm प्रति फ़ाइल एक बार के बजाय केवल एक बार लागू किया जाता है।

rm ./**/*.foo(e:'[[ -f ${REPLY%.foo}.bar ]]':) 
+1

बस मामले में, मैं हमेशा इस तरह के ग्लोब किए गए फ़ाइल नाम से पहले "-" का उपयोग करता हूं, और उपयोगकर्ता GLOB_DOTS सेट करना चाहता है (परिणाम "ढूंढने" के समान परिणाम प्राप्त करने के लिए): 'rm - **/*। Foo (De : '[[-एफ $ {उत्तर% .foo} .bar]]' :) ' – vinc17

+0

अच्छे अंक। मैंने '-' के बजाय '।/'का उपयोग करने के लिए उत्तर संपादित किया है, क्योंकि यह' आरएम' के किसी भी कार्यान्वयन के साथ काम करेगा। – chepner

संबंधित मुद्दे