एक निर्देशिका में सभी लेकिन 1000 यादृच्छिक फ़ाइलों को हटा दें


13

मैंने एक डेटा जेनरेशन स्क्रिप्ट को बहुत लंबे समय तक चलने दिया, जिसमें 200,000+ फाइलें हैं, जिनकी मुझे लगभग 1000 तक की आवश्यकता है। लिनक्स कमांड लाइन से, इन फ़ाइलों में से सभी 1000 को डिलीट करने का एक आसान तरीका है, जहां वे फाइलें बरकरार रखी जाएंगी फ़ाइल नाम या किसी अन्य विशेषता पर निर्भरता नहीं होगी?


क्या फ़ाइलों को बनाने वाली प्रक्रिया में एक विशेषता है जो प्रत्येक फ़ाइल को पिछले एक से संबंधित है? यदि हां, तो एक प्रतिनिधि नमूना प्राप्त करने के लिए यादृच्छिक रूप से चयन करना महत्वपूर्ण होगा। यदि प्रक्रिया उत्पन्न हुई फ़ाइलें जो प्रकृति द्वारा यादृच्छिक हैं, तो आप पहले 1000 के बाद सब कुछ हटा सकते हैं।
— fixer1234

जवाबों:


15

एक निर्देशिका में सभी लेकिन 1000 यादृच्छिक फ़ाइलों को हटा दें

कोड:

find /path/to/dir -type f -print0 | sort -zR | tail -zn +1001 | xargs -0 rm

स्पष्टीकरण:

  1. के /path/to/dirसाथ सभी फाइलों को सूचीबद्ध करें find;
    • print0: लाइन सीमांकक के रूप में \0( शून्य वर्ण ) का उपयोग करें ; इसलिए रिक्त स्थान / newlines वाले फ़ाइल पथ स्क्रिप्ट को नहीं तोड़ते हैं
  2. फ़ाइल सूची के साथ फेरबदल करें sort;
    • -z: (एक नई पंक्ति) के \0बजाय परिसीमाक के रूप में (शून्य वर्ण) का उपयोग करें\n
    • -R: अनियमित क्रम
  3. यादृच्छिक सूची से पहली 1000 लाइनों को पट्टी करें tail;
    • -z: सूची को शून्य-सीमांकित के साथ व्यवहार करें (उसी के साथ sort)
    • -n +1001: 1001 से शुरू होने वाली लाइनें दिखाएं (यानी पहली 1000 लाइनों को छोड़ दें)
  4. xargs -0 rm - शेष फाइलें हटा दें;
    • -0: शून्य-सीमांकित, फिर से

क्यों यह क्विक्सोटिक के समाधान से बेहतर है *:

  1. रिक्त स्थान / newlines वाले फ़ाइलनाम के साथ काम करता है।
  2. कोई निर्देशिका बनाने का प्रयास नहीं करता है (जो पहले से मौजूद है, btw।)
  3. किसी भी फाइल को स्थानांतरित नहीं करता है, 1000 "भाग्यशाली फाइलों" को छूने के अलावा उन्हें सूचीबद्ध नहीं करता है find।
  4. किसी कारण से (न्यूलाइन) के उत्पादन के findसमाप्त नहीं होने की स्थिति में किसी फ़ाइल को अनुपलब्ध करना \n।

* - को ऋण विलक्षण के लिए | sort -R | head -1000, मुझे एक प्रारंभिक बिंदु दे दी है।


CentOS 6 पर चलने से मुझे अमान्य ऑपरेंड के बारे में त्रुटियाँ हो रही थीं। सौभाग्य से मैं फाइलपेथ्स में रिक्त स्थान से संबंधित नहीं हूं, इसलिए उन ऑपरेंड को हटाने से मेरे लिए काम कियाfind . -type f | sort -R | tail -n +1001 | xargs rm
— ब्रैड

@ ब्रैड क्या आप त्रुटि संदेश और अपना संस्करण प्रदान कर सकते हैं find? मैं अपने उत्तर को बेहतर बनाने की कोशिश करूंगा, बस काम करने के लिए कुछ इनपुट चाहिए।
— पुराना।

3
tail: invalid option -- 'z'मेरे पास पूंछ के संस्करण 8.4 है
— ब्रैड

अगर कोई फ़ाइल नहीं है (त्रुटि से छूट के लिए इसे दो बार चलाने के बाद)
— मैं

1

एक अस्थायी निर्देशिका का उपयोग करें, फिर findअपनी सभी फाइलें, सूची के साथ यादृच्छिक करें sort, और सूची के शीर्ष 1000 को अस्थायी निर्देशिका में स्थानांतरित करें। बाकी को हटा दें, फिर अस्थायी निर्देशिका से फ़ाइलों को वापस ले जाएं।

$ mkdir ../tmp-dir
$ find . -type f | sort -R | head -1000 | xargs -I "I" mv I ../tmp-dir/
$ rm ./*
$ mv ../tmp-dir/* .

अगर xargsलाइन की लंबाई के बारे में शिकायत, साथ एक छोटी संख्या का उपयोग headकरें और आवश्यकतानुसार आदेश दोहराने (यानी, परिवर्तन -1000करने के लिए -500करने के लिए और उसे दो बार चलाने के लिए, या परिवर्तन -200और इसे चलाने के लिए 5 बार।)

यह उन फ़ाइलनामों को संभालने में भी विफल होगा जिनमें रिक्त स्थान शामिल हैं; के रूप में @ रालोद के जवाब से पता चलता है, तो आप उपयोग कर सकते हैं findके -print0तर्क, -zतर्क करने के लिए sortऔर head, और -0साथ xargsउचित फ़ाइल नाम से निपटने के लिए सुनिश्चित करें।

अंत में, यदि tmp-dirपहले से मौजूद है, तो आपको एक निर्देशिका नाम बदलना चाहिए जो मौजूद नहीं है।


यह विफल हो जाएगा अगर किसी भी फ़ाइलनाम द्वारा सूचीबद्ध findएक स्थान शामिल है।
— पुराना।

0

मैक उपयोगकर्ताओं के लिए निम्न स्क्रिप्ट करना चाहिए।

find . -type f -print0 | tr '\0' '\n' | sort -R | tail -n +10000 | tr '\n' '\0' | xargs -0 rm

trके \nबजाय के साथ सूचियों पर काम करने के लिए सॉर्ट और पूंछ की अनुमति देगा \0।


-2

निर्देशिका को rm -rf करना सबसे आसान हो सकता है, फिर डेटा जेनरेशन स्क्रिप्ट को फिर से चलाना, जबकि यह सुनिश्चित करना कि वह बहुत लंबे समय तक न चले।


यही नहीं ओपी ने पूछा। शायद ऐसा करना संभव नहीं है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.