লিনাক্সে, সমস্ত ফাইল মুছবেন কীভাবে * .txt প্যাটার্নটি ছাড়াই?


73

আমি জানি যে কীভাবে txtবর্তমান ডিরেক্টরিতে সমস্ত ফাইল মুছতে হয় rm *.txt। বর্তমান ডিরেক্টরি EXCEPT txtফাইলের সমস্ত ফাইল কীভাবে মুছতে হয় কেউ জানেন ?


20
বরাবরের মতো, প্রদত্ত উত্তরগুলি lsবাস্তবে কল করার চেষ্টা করার আগে যেমন একটি নির্দোষ কমান্ড দিয়ে পরীক্ষা করুন rm
চিপনার

উত্তর:


111

আপনি ব্যবহার করতে পারেন find:

find . -type f ! -name '*.txt' -delete

বা বাশের বর্ধিত গ্লোববিং বৈশিষ্ট্যগুলি:

shopt -s extglob
rm *.!(txt)

বা zsh এ:

setopt extendedglob
rm *~*.txt(.)
#  ||     ^^^ Only plain files
#  ||^^^^^ files ending in ".txt"
#  | \Except
#   \Everything

আপনার কিছু ফোল্ডার রয়েছে এবং সেগুলি দিয়ে আপনি কী করতে চান তার উপর নির্ভর করে এর মধ্যে কিছু মানিয়ে নেওয়া দরকার।
কেভিন

1
না করা উচিত *.!(txt)হবে !(*.txt)?
ল্রি

@ লৌরিরন্ত ফোল্ডারে কী রয়েছে তার উপর নির্ভর করে, যার উত্তর আমরা পাইনি। এটি ঠিক আছে যেমন সমস্ত ফাইলের এক্সটেনশন রয়েছে এবং rmফোল্ডার থাকলে শ্বাসরোধ করবে।
কেভিন

আমি বন্ধনীগুলির সাথে একটি সমস্যা পেয়েছি। আমি যখন ব্যাশ স্ক্রিপ্টে গ্লোব্বিং স্টাইলটি ব্যবহার করি তখন এটি একটি সিনট্যাক্স ত্রুটি এবং প্রথম বন্ধনী সম্পর্কে অভিযোগ করে। তবে সিএলআই থেকে এটি কাজ করে।
সিএমসিডিগ্রাগনকাই

1
@ আইজোগফিফ চেক করুন এটি find . -type f ! -name "*.txt" | xargs -r rmজিএনইউ xargs এ কাজ করবে। বিএসডি এবং ইউনিক্স xargs কমান্ডের নাও থাকতে পারে man xargs
-আপনার লোকালটি

10

আপনি যদি কেবল '* .txt' ব্যতীত সমস্ত ফাইল মুছতে চান তবে আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:

$ find . -type f ! -name "*.txt" -exec rm -rf {} \;

তবে আপনি যদি ফাইলগুলির সাথে ডিরেক্টরিগুলিও মুছতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

$ find . ! -name "*.txt" -exec rm -r {} \;


9

এটি করতে পারে অনেক উপায় আছে। তবে সবচেয়ে সহজ উপায় হ'ল (বাশ):

shopt -s extglob
rm !(*.txt)

4

একটি সমাধান ছাড়া find:

mv dir/*.txt otherdir/
rm -r dir
mv otherdir dir

এটি সমস্ত ধরণের শাঁসের উপর কাজ করা উচিত।


3

আপনি ইনভার্টেড গ্রেপ এবং xargs ব্যবহার করতে পারেন

ls | grep -v .txt$| xargs rm

ls | grep -v *.txt | xargs rmঠিক পাশাপাশি কাজ করে
ফিলিপস্ক

ঠিক ফিলিপস্ক grep -v *.txtকেবল তখনই কাজ করবে যদি একটি .txtফাইল থাকে। যদি কিছুই না থাকে তবে প্যাটার্ন হিসাবে grepব্যবহার করবেন *.txt; যদি একের বেশি থাকে তবে এটি .txtআউটপুটটিকে অগ্রাহ্য করে অন্যান্য ফাইলগুলির মধ্যে প্রথম ফাইলের নাম অনুসন্ধান করবে ls। (সুনির্দিষ্ট ফলাফলগুলি শেলের
গ্লোব

.txt$txtবিন্দু নির্বিশেষে স্ট্রিংগুলি শেষ হবে । কারণ grepপ্যারামিটার হিসাবে নিয়মিত ভাব প্রকাশ করে। সুতরাং ফাইল a.txtএবং aatxtএবং a-txtএই সব অভিব্যক্তি দ্বারা মেলানো করা হবে না। সঠিক মত প্রকাশ করা উচিত ls | grep -v \\.txt$ | xargs --no-run-if-empty rm। কৌতূহলী ব্যক্তিদের জন্য: আপনি যদি অভিব্যক্তিটি নিয়ে ঘুরে দেখতে চান তবে নিরাপদে এই পরীক্ষামূলক অভিব্যক্তিটি ব্যবহার করুন ls | grep \\.txt$ | xargs --no-run-if-empty echo(দ্রষ্টব্য: কোনও -vপতাকা নেই এবং নেই rm=>echo)। দ্রষ্টব্য 2: আপনি সম্ভবত ডাবল ব্যাকস্ল্যাশ লক্ষ্য করেছেন। একটি রেজেক্সের জন্য, অন্যটি স্ল্যাশ থেকে বাঁচার জন্য বাশের জন্য for
দিমিত্রি কে

1

সহজভাবে করুন:

rm $(ls -I "*.txt" ) # .Txt ব্যতীত ফাইলের ধরন মুছে ফেলা হয়

একইভাবে, যদি "এক বা একাধিক ফাইল প্রকার বাদে" মুছতে হয়, তবে:

rm $(ls -I "*.txt" -I "*.pdf" ) # * টেক্সট এবং * .পিডিএফ বাদে ফাইলের ধরণগুলি ডিলিট করে


স্ট্যাকএক্সচেঞ্জে স্বাগতম! -Iবিকল্প উপযোগী হতে পারে, কিন্তু দেখতে কেন ম বিশ্লেষণ করা । এবং কী | xargsঅর্জন করে? কোনও যুক্তি ছাড়াই, এটি কেবল echoতার সমস্ত ইনপুটটিতে চলে।
জিগলিগা

কী xargsঅর্জন করার কথা?
ধাগ

ধন্যবাদ, xargs উপরের ক্ষেত্রে কার্যকর ছিল না, এখনই সংশোধন করেছেন।
সূর্য

0

এটি বর্ণিত একটি ( ) বাদে সমস্ত লুকানো (ডট) ফাইল এবং ফোল্ডারগুলি সরাতেও কাজ করে .mydir:

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