सूची से फ़ाइलों को हटाना


13

मैं फ़ाइलों की सूची निकालना चाहता हूँ और पुष्टि के लिए कहा जा सकता हूँ। सूची list.txtफ़ाइल में है। निम्न कमांड ठीक से काम क्यों नहीं करता है?

while read i; do rm -i $i; done < list.txt

पिछली कमांड मेरा इंतजार नहीं करती है लेकिन सौभाग्य से कोई फाइल डिलीट नहीं हुई है।

मैं बैश का उपयोग कर रहा हूं।

जवाबों:


20

rm -iमानक इनपुट से इसका उत्तर पढ़ता है, जो इसे whileलूप से विरासत में मिला है । तो list.txt"वास्तव में हटाएं" के उत्तर के रूप में पाठ की एक पंक्ति का उपयोग किया जा रहा है? सवाल। ठीक करने के लिए, आपको इनपुट के दो स्रोतों को अलग करना होगा। सबसे आसान तरीका है कि आप readइसके इनपुट को एक अलग फ़ाइल डिस्क्रिप्टर से लें:

while IFS= read <&3 -r i; do
  rm -i -- "$i"     # Quote the file name, not just to be safe,
                    # but because it's the right syntax.
done 3< list.txt

आप अब लूप के लिए मानक इनपुट (fd 0) को पुनर्निर्देशित नहीं कर रहे हैं, इसलिए rmटर्मिनल से वांछित के रूप में पढ़ा जाएगा।

वैकल्पिक रूप से, आप कर सकते थे:

IFS=$'\n' # set field separator to newline
set -f    # disable globbing upon command substitution
rm -i -- $(cat list.txt)

या, GNU xargs के साथ:

xargs -rd '\n' --arg-file=list.txt rm -i --

1
तो अगर मुझे सूची में एक फ़ाइल नाम दिया गया है y, तो पिछली फ़ाइल हटा दी गई होगी?
फ्रांसेस्को तुर्को

5
न सिर्फ y, बल्कि किसी भी नाम की शुरुआत y। जाहिर है, rmजो भी प्रतिक्रिया मिलती है, उसके पहले चरित्र को देखता है: 'y' हां, और कुछ भी नहीं है।
शेपनर

2

प्रत्येक फ़ाइल के लिए हां या ना में जवाब देने की तुलना में कुछ iselectकट्टरपंथियों के लिए , आप इंटरेक्टिव ncurses- आधारित चयन के लिए उपयोग कर सकते हैं । जैसे

iselect -a -m < list.txt | xargs -d '\n' -r echo rm 

या वर्तमान dir में फ़ाइलों के चयन की अनुमति देने के लिए:

find . -maxdepth 1 -type f | iselect -a -m | xargs -d '\n' -r echo rm

यह एक पूर्ण-स्क्रीन (पूर्ण-टर्मिनल) ncurses- आधारित लिस्टिंग प्रदर्शित करेगा, जहाँ फ़ाइलों का चयन किया जा सकता है और SPACE दबाकर डी-सेलेक्ट किया जा सकता है। अपने चयनों को स्वीकार करने के लिए ENTER दबाएँ (चयनित प्रविष्टियों को stdout पर मुद्रित किया जाएगा), या qछोड़ने के लिए (stdout के लिए मुद्रित कुछ भी नहीं)। hमदद के लिए दबाएं

ध्यान दें echo rm- मैंने इसे परीक्षण के लिए इस तरह लिखा है। इसे बदलने के लिए बस rmएक बार आप आश्वस्त हो जाएं कि आप समझते हैं कि यह क्या कर रहा है।

यह भी ध्यान दें कि xargsयहां \nइनपुट सेपरेटर के रूप में उपयोग किया जा रहा है । यह काम नहीं करेगा यदि किसी भी फ़ाइल नाम में वर्णों को पंक्तिबद्ध किया गया हो। उस मामले के लिए, iselectया तो ठीक से काम नहीं करेगा - यह प्रति पंक्ति एक आइटम की अपेक्षा iselectकरता है - यू दुर्भाग्य से, शून्य-समाप्त इनपुट या आउटपुट के लिए कोई विकल्प नहीं है।

iselectडेबियन के लिए पैक किया गया है, शायद ubuntu और अन्य डिस्ट्रोस भी। होम पेज http://www.ossp.org/pkg/tool/iselect/ पर है

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