2011-10-01 18 views
5

मैंने ऐसी निर्देशिका में कुछ अनचाहे किया है जिसमें पहले से ही बहुत सी चीजें हैं। मैं इसके बजाय एक अलग निर्देशिका में untar करना चाहता था। अब बीच में अंतर करने के लिए बहुत सारी फाइलें हैं। हालांकि, जिन फ़ाइलों को मैंने अनारक्षित किया है, वे अभी अभी (दाएं?) बनाए गए हैं और मूल फ़ाइलों को लंबे समय तक संशोधित नहीं किया गया है (कम से कम एक दिन)। क्या उनकी सृजन जानकारी के आधार पर इन अनछुए फ़ाइलों को हटाने का कोई तरीका है?लिनक्स में निर्देशिका में हाल ही में बनाई गई सभी फ़ाइलों को कैसे हटाएं?

उत्तर

6

टैर आमतौर पर फ़ाइल टाइमस्टैम्प को पुनर्स्थापित करता है, इसलिए समय के साथ फ़िल्टर करने की संभावना नहीं है।

आप अभी भी टार फ़ाइल है, तो आप क्या आप की तरह कुछ के साथ अनपैक किया नष्ट करने के लिए उपयोग कर सकते हैं:

tar tf file.tar --quoting-style=shell-always |xargs rm -i 

ऊपर ज्यादातर मामलों में काम करेंगे, लेकिन सभी (फ़ाइल नाम एक गाड़ी वापसी है उनमें से तोड़ देगा), इसलिए सावधान रहें।

आप -r जोड़ कर निर्देशिका को हटा सकते हैं, लेकिन शायद यह अपेक्षाकृत अपूर्ण निर्देशिकाओं को मैन्युअल रूप से हटाने के लिए सुरक्षित है।

+2

फ़ाइल नामों में रिक्त स्थान के साथ काम करना वास्तव में आसान है, और यह एक बेहतर जवाब होगा। – Omnifarious

+0

@omnifa इस काम को रिक्त स्थान के साथ कैसे बनाना है? निकाली गई निर्देशिकाओं को हटाने के लिए, क्या मुझे आरएम के बाद आर भी शामिल करना चाहिए? – AnkurVj

+0

@AnkurVj: दुर्भाग्य से टैर बनाने के लिए वास्तव में एक तरीका नहीं है जो आपको फ़ाइल नामों की एक शून्य वर्ण अलग सूची देता है, जो काफी निराशाजनक है। और हां, 'आरएम' के बाद '-r' होना चाहिए। चूंकि मैट उत्तर अपडेट नहीं कर रहा है, इसलिए मैं अपना खुद का रखूंगा। – Omnifarious

3

ढूंढें। -माटा -1-प्रकार एफ | xargs आरएम

लेकिन

के साथ पहले परीक्षण करें। -माटा -1-प्रकार एफ | xargs echo

+2

यह दो चीजों को छोड़कर अच्छा होगा। सबसे पहले, ** हमेशा **'print0' और 'xargs -0' का उपयोग करें। आप फाइलनामों में यादृच्छिक स्पेस वर्ण नहीं चाहते हैं जिससे आपको समस्याएं आ सकें। दूसरा, 'tar' टाइमस्टैम्प को पुनर्स्थापित करता है, इसलिए आप वास्तव में यहां mtime का उपयोग नहीं कर सकते हैं। शायद एनीम, शायद, अगर आपके फाइल सिस्टम को इसे अद्यतन करने के लिए कॉन्फ़िगर किया गया है। – Omnifarious

+0

इसके अलावा, नोट करें उदा। पिछले दस मिनट में संशोधित फ़ाइलों के लिए -mmin -10 खोजें – sehe

1

जटिलता बढ़ाने के क्रम में इस प्रश्न के कई अलग-अलग उत्तर हैं।

सबसे पहले, यदि यह एक बंद है, और इस विशेष उदाहरण में आप पूरी तरह से सुनिश्चित हैं कि आपके फ़ाइल नामों में कोई अजीब वर्ण नहीं हैं (रिक्त स्थान ठीक हैं, लेकिन टैब, न्यूलाइन या अन्य नियंत्रण वर्ण नहीं, न ही यूनिकोड वर्ण) यह काम करेगा:

tar -tf file.tar | egrep '^(\./)?[^/]+(/)?$' | egrep -v '^\./$' | tr '\n' '\0' | xargs -0 rm -r 

सब कुछ उदासीनता उपनिर्देशिका की सभी उप-निर्देशिकाओं पर छोड़ना है।

यह है कि फैशनेबल फ़ाइल नामों के साथ काम करता है क्या करने के लिए एक और तरीका है यह है:

mkdir foodir 
cd foodir 
tar -xf ../file.tar 
for file in *; do rm -rf ../"$file"; done 

यह एक निर्देशिका है, जिसमें अपने संग्रह का विस्तार किया गया पैदा करेगा, लेकिन यह लगता है कि आप कि चाहता था पहले से ही वैसे भी। यह . के साथ शुरू होने वाली किसी भी फाइल को भी संभाल नहीं पाएगा।

फाइलों के साथ कि विधि काम है कि . के साथ शुरू करने के लिए, ऐसा करते हैं:

mkdir foodir 
cd foodir 
tar -xf ../file.tar 
find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 sh -c 'for file in "[email protected]"; do rm -rf ../"$file"; done' junk 

अन्त में, Mat's answer से ले रही है, तो आप ऐसा कर सकते हैं और यह किसी भी फ़ाइल नाम के लिए काम करते हैं और नहीं untar करने की आवश्यकता होगी फिर निर्देशिका:

tar -tf file.tar | egrep '^(\./)?[^/]+(/)?$' | grep -v '^\./$' | tr '\n' '\0' | xargs -0 bash -c 'for fname in "[email protected]"; do fname="$(echo -ne "$fname")"; echo -n "$fname"; echo -ne "\0"; done' junk | xargs -0 rm -r 
0

आप के साथ एक पास में फ़ाइलों और निर्देशिकाओं संभाल कर सकते हैं:

tar -tf ../test/bob.tar --quoting-style=shell-always | sed -e "s/^\(.*\/\)'$/rmdir \1'/; t; s/^\(.*\)$/rm \1/;" | sort | bash 

आप क्या

tar -tf ../test/bob.tar --quoting-style=shell-always | sed -e "s/^\(.*\/\)'$/rmdir \1'/; t; s/^\(.*\)$/rm \1/;" | sort 

linefeeds साथ फ़ाइल नामों को संभालने के लिए 'बैश' के लिए आप अधिक संसाधन की जरूरत को बंद रखना होगा पाइप होने जा रहा है देख सकते हैं।

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