ইন্টারেক্টিভভাবে একটি তালিকা থেকে ফাইলগুলি মুছে ফেলা হচ্ছে


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)

বা, জিএনইউ 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

এটি একটি পূর্ণ-স্ক্রিন (পূর্ণ-টার্মিনাল) এনক্রস-ভিত্তিক তালিকা প্রদর্শন করবে, যেখানে স্পেস টিপে ফাইলগুলি নির্বাচন করা এবং ইচ্ছামত ডি-সিলেক্ট করা যেতে পারে। আপনার নির্বাচনগুলি গ্রহণ করার জন্য ENTER টিপুন (নির্বাচিত এন্ট্রিগুলি stdout এ মুদ্রিত হবে), বা qপ্রস্থান করতে (স্টাডাউটে মুদ্রিত কিছুই নয়)। hসাহায্যের জন্য টিপুন ।

নোট করুন echo rm- আমি পরীক্ষার জন্য এটি এটি লিখেছি। rmআপনি একবারে আত্মবিশ্বাসী হন যে এটি কী করছে তা কেবল একবার এটিকে পরিবর্তন করুন ।

এছাড়াও নোট করুন যে xargsএখানে \nইনপুট বিভাজক হিসাবে ব্যবহার করা হচ্ছে । ফাইলের কোনওর মধ্যে যদি লাইনফিড অক্ষর থাকে তবে এটি কাজ করবে না। এই ক্ষেত্রে, এটি iselectসঠিকভাবে কাজ করবে না - এটি প্রতি লাইনে একটি আইটেম প্রত্যাশা করে - u দুর্ভাগ্যক্রমে, iselectনাল-টার্মিনেটড ইনপুট বা আউটপুট জন্য কোনও বিকল্প নেই।

iselectএটি ডেবিয়ানের জন্য প্যাকেজযুক্ত, সম্ভবত উবুন্টু এবং অন্যান্য ডিস্ট্রোসের জন্যও। হোম পৃষ্ঠাটি http://www.ossp.org/pkg/tool/iselect/ এ রয়েছে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.