2015-09-02 6 views
6

मेरे पास एक निर्देशिका है (~/temp/) जिसमें कई फ़ाइलें और उप निर्देशिकाएं हैं, और कुछ निर्देशिकाओं में, उनमें अन्य फ़ाइलें और उप निर्देशिकाएं हो सकती हैं। इसके अलावा, निर्देशिका में (~/temp/), इसमें kept.txt नाम के साथ एक विशेष txt फ़ाइल है, यह ~/temp/ में निहित कुछ सीधी फ़ाइलें और उप निर्देशिका सूचीबद्ध करती है, अब मैं ~/temp/ के अंतर्गत सभी अन्य फ़ाइलों और निर्देशिकाओं को हटाना चाहता हूं जो सूचीबद्ध नहीं हैं kept.txt फ़ाइल, शेल कमांड के साथ इसे कैसे करें, बेहतर बेहतर।शैल स्क्रिप्ट: किसी फ़ाइल में सूचीबद्ध लोगों को छोड़कर निर्देशिका में सभी फ़ाइलों को कैसे हटाएं?

उदा।

निर्देशिका के रूप में नीचे पसंद करती है:

$ tree temp/ -F 
temp/ 
├── a/ 
├── b/ 
├── c/ 
│   ├── f2.txt 
│   └── z/ 
├── f1.txt 
└── kept.txt 

kept.txt की सामग्री है:

$ more kept.txt 
b 
kept.txt 

इस मामले के लिए:

  1. मैं a/, c/ और f1.txt हटाना चाहते हैं। c/ के लिए, निर्देशिका स्वयं और सभी उप सामग्री (फ़ाइलें और निर्देशिका) हटा दी जाएगी।
  2. kept.txt में, प्रारूप प्रति पंक्ति एक आइटम (फ़ाइल या निर्देशिका) है।

उत्तर

3

extglob का उपयोग करके आप यह कर सकते हैं:

cd temp 
shopt -s extglob 

rm -rf !($(printf "%s|" $(<kept.txt))) 

printf "%s|" $(<kept.txt)b|kept.txt| और !(...) के रूप में उत्पादन प्रदान करेगा एक extended glob pattern मैच नकारना है।

+0

इसके अलावा 'keep.txt' को भी हटा दिया जाएगा। – cdarke

+0

नहीं, यह इसे हटा नहीं देगा क्योंकि ओपी ने 'keep.txt' फ़ाइल' रखा है 'रखा है। – anubhava

+0

याद किया कि, क्षमा करें। (क्या वह संपादित नहीं किया गया था?) – cdarke

1

एक अस्थायी फ़ोल्डर के लिए सब कुछ ले जाएँ। .txt में सूचीबद्ध फ़ाइलों/निर्देशिकाओं को वापस ले जाएं। फिर, आखिरकार, अस्थायी फ़ोल्डर को हटा दें।

+1

हाँ, यह इस समस्या को हल करने के लिए एक सरल अच्छा तरीका है, लेकिन अगर वहाँ यह करने के लिए कुछ सरल कमांड है मुझे यकीन नहीं कर रहा हूँ। – manshou

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

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