टर्मिनल से फ़ाइल नाम के आधार पर विशिष्ट फ़ाइलों को हटाना


13

मेरे पास एक निर्देशिका है जिसमें नामों के साथ फाइलें हैं

rho_0.txt
rho_5000.txt
rho_10000.txt
rho_150000.txt
rho_200000.txt

और इसी तरह। मैं उन सभी को हटाना चाहूंगा जो 5000 के गुणक हैं।

मैंने निम्नलिखित कोशिश की: printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | rmलेकिन उसने मुझे प्रतिक्रिया दी rm: missing operand

क्या इसे करने का और कोई तरीका है?


6
आप ऐसा कैसे करते हैं, इसके बावजूद, मैं वांछित फ़ाइलों को निर्देशिका में ले जाने की सलाह देता हूं (सुरक्षा के लिए), तब जब आपने पुष्टि की है कि सभी और केवल नष्ट की जाने वाली फाइलें निर्देशिका में हैं, तो निर्देशिका को हटा दें।
user117529

यहां सुरक्षा महत्वपूर्ण है। मैं आम तौर पर इन चीजों को lsपहले के साथ परखता हूं ।
स्कॉट

जवाबों:


49

आपके पास एक लूप या अतिरिक्त कमांड की आवश्यकता नहीं है जहां आपके पास है Bash Shell Brace Expansion

rm -f rho_{0..200000..5000}.txt

स्पष्टीकरण : {start..end..step}-fन के बराबर फाइलों पर शीघ्र अनदेखी करने के लिए।


Ps सुरक्षा और जाँच रखने के लिए कि कौन सी फाइलें हटाई जाएंगी, कृपया पहले एक परीक्षण करें:

ls -1 rho_{0..200000..5000}.txt

13

rmमानक इनपुट से नहीं पढ़ता है। तुम यह कर सकते थे:

for i in $(seq 5000 5000 25000); do
    rm -i rho_${i}.txt
done

मुझे हटाने से पहले संकेत -iदेने का विकल्प शामिल है rmताकि आप व्यवहार को सत्यापित कर सकें। एक बार जब आप आश्वस्त हो जाते हैं कि यह वही है जो आप चाहते हैं, तो आप उस विकल्प को छोड़ सकते हैं।

संपादित करें: वैकल्पिक रूप से, आप कर सकते हैं:

for ((i = 5000; i <= 25000; i += 5000)); do
    rm -i rho_${i}.txt
done

यदि आपने कोई प्रोग्रामिंग की है तो वह फ़ॉर्म अधिक परिचित हो सकता है।


12

आप किसी प्रोग्राम में पाइप नहीं कर सकते जैसे कि पाइप की सामग्री में तर्क थे। इसे स्टड के माध्यम से भेजा जाता है।

आपको इस उद्देश्य के लिए xarg का उपयोग करना चाहिए:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs rm 

लेकिन पहले आप इको के साथ एक कोशिश दे सकते हैं यह देखने के लिए कि क्या सब कुछ आपके जैसा है

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs echo

यदि आपके संस्करण में / विकल्प है, तो आप इस काम के बजाय seqउसका उपयोग कर सकते हैं-साथ और कमांड प्रतिस्थापन। -f--formatprintf
डेविड फ़ॉस्टर

धन्यवाद, मैंने प्रश्न में प्रयुक्त कमांड का उपयोग करते हुए उत्तर दिया है और अपनी rm त्रुटि को समझाने की कोशिश कर रहा
हूं

9

अगर मैं गलत हूं, तो कोई मुझे सही करेगा, लेकिन अगर सभी फाइलें जो rho_इस फॉर्म से शुरू होती हैं, तो यह करने के बराबर नहीं है

rm rho_0.txt rho_*[05]000.txt

चूँकि एक संख्या (0 के अलावा) 5000 की एक बहु है और यदि केवल 0000 या 5000 में समाप्त होती है।

(0 एक विशेष मामला है, क्योंकि यह 5000 का गुणक है, लेकिन आम तौर पर बिना अतिरिक्त प्रमुख शून्य के लिखा जाता है। यदि आप 0 को शामिल करने का इरादा नहीं रखते हैं, तो इसे उपरोक्त पंक्ति से बाहर निकालें।)

निश्चित रूप से इसका उपयोग केवल तभी किया जाना चाहिए जब rho_*.txtआपकी निर्देशिका की सभी फ़ाइलों का वांछित रूप हो। अगर आपकी निर्देशिका में भी यह प्रयोग न करें rho_please_dont_delete_me_5000.txt

(गणित नोट: यह ठीक काम करता है क्योंकि 5000 के सभी प्रमुख कारक, अर्थात् 2 और 5, हम जिस आधार में काम कर रहे हैं, उसके भी प्रमुख कारक हैं। 10. समान रूप से, 10 की पर्याप्त रूप से बड़ी शक्ति है (अर्थात 10000) 5000 से विभाज्य। उन सभी के मिलान के लिए समान चाल नहीं है जो 3000 के गुणक हैं।)


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