আমি কীভাবে গ্রেপ থেকে এলএস পাইপ করব, এবং গ্রেপ দ্বারা ফিল্টার করা ফাইলগুলি মুছব?


33

আমি আমার হোম ফাইলে কিছু প্যাকেজ মুছতে চেয়েছি, তবে ফাইলটির নামটি খুব দীর্ঘ ( google-chrome-stable_current_i386.deb)। সুতরাং, আমি ls|grep chrome|rmক্রোম ফাইলটি ফিল্টার করার জন্য ফাইলগুলি গ্রেপ করার জন্য কমান্ডটি ব্যবহার করার সিদ্ধান্ত নিয়েছি এবং তারপরে এটি সরিয়ে ফেলব। এটি কাজ করে না, তাই আমি কীভাবে এটি করতে পারি তা দেখতে চাই।


22
rm -i *chrome*.deb
ল্যামবার্ট

28
লোকেরা উত্তরগুলি যখন "এটি না করে" উত্তর দেয় তবে আমি সাধারণত অপছন্দ করি, তবে এটি আমার দেখা XY সমস্যার অন্যতম সেরা উদাহরণ । আপনার আসল প্রশ্নটি হল "পুরো জিনিসটি টাইপ না করে আমি কীভাবে একটি দীর্ঘ ফাইলের নাম দিয়ে দ্রুত কীভাবে একটি ফাইল মুছব", এবং এমন অনেকগুলি ভাল উপায় রয়েছে যা থেকে আউটপুট গ্রেপিংয়ের সাথে জড়িত নাls
মাইকেল মরোজেক

5
শুধু ব্যবহার করুন find- find . -name "*chrome*" -delete
বোরিস স্পাইডার


3
স্ট্যাক এক্সচেঞ্জ ব্যবহারকারী হিসাবে আমার দুটি সেন্ট: ভবিষ্যতে আপনি কী চেষ্টা করেছেন সে সম্পর্কে বিশদ সরবরাহ করার সময় আপনার প্রশ্নটি আরও সাধারণ পদ্ধতিতে জিজ্ঞাসা করুন। "আমি ফাইলের একটি নির্দিষ্ট স্ট্রিং সহ কোনও ফোল্ডারে থাকা কোনও ফাইলকে কীভাবে মুছব?" এটি উচ্চারণ করার ভাল উপায় হতে পারে। তারপর আপনি কেবল একটি সরাইয়া হিসাবে যোগ করতে পারি, আপনি বংশীধ্বনিতুল্য চেষ্টা lsমাধ্যমে grepকরতে rmকিন্তু এটা কাজ পাই নি। এইভাবে আপনি কোনও অযোগ্য সমাধান সম্পর্কে ভাল উত্তর দেওয়ার জন্য আপনাকে বাধ্য করার চেয়ে আপনার কাজটি সম্পাদনের "সঠিক" বা "সবচেয়ে সহজ" উপায় সম্পর্কে একটি বা দুটি ভাল উত্তর পাবেন।
অ্যাড্রিয়ান

উত্তর:


56

এটি প্রায় আমাকে কুঁচকে ফেলল।

  1. আপনি সম্ভবত আপনার পায়ে শটগানটি দেখানো বন্ধ করতে চাইতে পারেন । মূলত যেকোন ধরণের পার্সিং বা গ্লোব প্রতিষ্ঠিত পদ্ধতির চেয়ে জটিল ও ত্রুটি-প্রবণls হতে চলেছে ।find [...] -exec
  2. আপনার জন্য কেউ যদি কোনও ট্রোল ডিস্ট্রো ইনস্টল না করে তবে আপনার শেলটি Tabসম্পূর্ণ হবে। শুধু টাইপ করুন rm googleএবং টিপুন Tab। এটি অবিলম্বে সম্পূর্ণ না হলে, Tabম্যাচের ফাইলগুলির একটি তালিকা দেখতে আবার টিপুন । এটি সম্পূর্ণ না হওয়া অবধি সংক্ষিপ্ত করতে ফাইলের আরও অক্ষর টাইপ করুন, তারপরে কমান্ডটি চালান।
  3. পাইপ ! = পরামিতি । স্ট্যান্ডার্ড ইনপুট হ'ল একটি বাইনারি ডেটা স্ট্রিম যা একটি কমান্ডকে অবিচ্ছিন্নভাবে খাওয়ানো যায়। প্যারামিটার হ'ল স্পেস বিভাজনযুক্ত স্ট্রিং যা একবার চালানোর সময় একবার এবং কেবল একবার আদেশে পাস করা হয়। এগুলি খুব কমই বিনিময়যোগ্য।

1
যদি এটি n00b প্রশ্নের মতো মনে হয় তবে দুঃখিত আমি জানতাম যে এটি সাধারণত ব্যবহার করা ঠিক ছিল, কারণ বিবৃত প্যাকেজটি ছিল "ক্রোম" সম্বলিত একমাত্র প্যাকেজটিতে। সুতরাং, গ্রেপ ব্যবহারের ফলে কেবল একটি ফাইলই ফিল্টার হয়ে যায়। আমি লিনাক্সে বেশ নতুন, এবং আমি ইতিমধ্যে প্রচুর ব্যাশ স্ক্রিপ্টগুলি সম্পন্ন করেছি, তবে আমি এখনও সবকিছু জানি না: পি। হর্ষ, বন্ধু
স্পেশালবম্ব

5
রূ be় হওয়ার অর্থ ছিল না, তবে শেলটি কঠোর এবং ক্ষমাযোগ্য পরিবেশ নয় যা ব্যবহারকারীদের বন্ধুত্বপূর্ণ পৃষ্ঠের পিছনে লুকিয়ে রয়েছে hidden জিনিসগুলি নিরাপদে যথেষ্ট কঠিন, কিছু মনে করবেন না নিরাপদে বা এমনকি সঠিকভাবে
l0b0

2
@ স্পেশালবম্ব এটি একমাত্র সঠিক উত্তর। অন্যান্য উত্তরগুলি যেমন শটগানকে পরিষ্কারভাবে কারও পা কেটে ফেলার জন্য কীভাবে লক্ষ্য করা যায় তা ব্যাখ্যা করার উপায়টি অবশ্যই যাওয়ার উপায় নয়। অন্ধভাবে মৃত্যুদন্ড কার্যকর করার বিষয়ে বিশেষত সতর্ক থাকুন rm- এটি সম্ভবত আপনার ডিস্ট্রো ভাজানোর একক সাধারণ উপায়।
বোরিস স্পাইডার

@ বোরিস্টস্পাইডার হে, আমি ইতিমধ্যে দুবার এএমডি গ্রাফিক্স কার্ড ড্রাইভার ইনস্টল করে অবশ্যই উবুন্টুকে ভাজা করেছি। যদিও আমি ইতিমধ্যে এটি সম্পর্কে একটি প্রশ্ন জিজ্ঞাসা করেছি। এএমডি ভয়ঙ্কর হয়ে উঠেছে, তাই আমি জিজ্ঞাসা করেছি যে কোনও এএমডি কার্ডে লিনাক্সের সাথে গেমিংয়ের কোনও সাধারণ সমাধান বা আরও ভাল পদ্ধতি আছে কি না।
স্পেশালবম্ব

34

আপনি ওয়াইল্ডকার্ড সহ ফাইন্ড কমান্ডটিও ব্যবহার করতে পারেন:

find . -maxdepth 1 -name '*chrome*' -delete

নোট করুন যে "-maxdepth" আর্গুমেন্টটি নিশ্চিত করে যে কেবলমাত্র বর্তমান ডিরেক্টরিতে কাজ করে এবং সাব-ডিরেক্টরিতে পুনরাবৃত্তি হয় না।


1
উন্নতির জন্য পরামর্শ: (ক) -inameকেস-সংবেদনশীল ফাইলের নাম xargsব্যবহার করুন (খ) এর -print0জন্য পতাকা findএবং -0পতাকা ব্যবহারের জন্য পাইপ xargs। এর ব্যবহার xargsআপনাকে "ইন্টারেক্টিভ" (মুছার নিশ্চয়তা foo?) মুছার মতো কাজ করতে দেয় ।
ক্রিস্টোফার শুল্টজ

3
আপনি যদি এক্সেক্স বিকল্পটি ব্যবহার করেন তবে xargs এ পাইপের দরকার নেই:find . -name '*chrome*' -exec rm -i {} +
জনি

4
এটি কি উপ-ডিরেক্টরিতে পুনরাবৃত্তভাবে মুছে ফেলবে না? আপনার 1 হতে নির্দিষ্ট maxdepthকরতে হতে পারে
টাইজয়েড

32

আপনার সঠিক ধারণা ছিল, কিছু বিবরণ মিস করেছেন। যেহেতু আপনি STDIN এ আসা কোনও তালিকা নিয়ে কাজ করছেন এবং rmপরামিতিগুলি প্রত্যাশা করছেন তাই আপনার ব্যবহারের প্রয়োজনxargs

এভাবে:

ls | grep chrome | xargs rm

আপনি যা চান তা আপনাকে দেওয়া উচিত

দ্রষ্টব্য যে আপনি যদি chromeফাইলটি বাদ দিয়ে অন্য কিছু মুছতে চান তবে আপনি কেবলমাত্র এতে যোগ -vকরতে পারেনgrep বিবৃতি।

মনে রাখবেন যে, এই প্রশ্নের অন্যান্য উত্তর অনুসারে, আপনি সম্ভবত যা অর্জন করতে চান এটি সম্পাদনের এটি সম্ভবত একটি খারাপ উপায়।


এর সাথে -v, এটি কি মিলে যাওয়া ফাইলগুলি বাদ দিয়ে সবকিছু মুছে ফেলবে না chrome? আমি মনে করি না যে ওপি এটি চায় ...
akivajgordon

আবার খুঁজছেন, আপনি সঠিক। ওপি "ক্রোম ফাইলটি ফিল্টার আউট" করতে চায়, তবে তারপরে এটি মুছে ফেলতে চায়।
জন


5
গৃহীত উত্তরগুলি কাজ করে তবে নীচের উত্তরটি দেখুন যা এটি কেন খারাপ ধারণা তা ব্যাখ্যা করে। (এই মন্তব্যটি এখানে কেবল তাদের পক্ষে পোস্ট করা যাঁরা "স্বীকৃত" চেকমার্ক দেখার সাথে সাথে থামেন))
জিম ডেভিস

1
এটি কেবলমাত্রls আউটপুটে "অদ্ভুত" ফাইলের নাম না থাকলে স্বীকৃত উত্তর "কাজ করে" । স্পেস সহ ফাইলের নামগুলি এটি নষ্ট করবে। আপনি যে ডিরেক্টরিটি চালান সেখানে যদি কেউ বিশেষ সস দিয়ে একটি ফাইলের নাম তৈরি করতে পারে তবে এটিও বিপজ্জনক । একাধিক ব্যক্তি ইতিমধ্যে চিহ্নিত করেছেন, ls এর আউটপুট বিশ্লেষণ করবেন না !
স্টিফেন পি

11

Ls এর আউটপুটটিকে কখনই পার্স করবেন না
আমার পরামর্শ হল ls [ 1 ] এর আউটপুটটি পার্স করা এড়ানো , আরও যদি এর সাথে মিলিত হয়del কমান্ডের । এটি মূলত অপ্রত্যাশিত এবং ফাইলের নামগুলিতে অনুমোদিত অক্ষরের সাথে সম্পর্কিত বিভিন্ন কারণে।

লিনাক্স প্যাকেজগুলির সাথে সম্পর্কিত ফাইলের নামগুলি "ভাল আচরণ করবে " এমনটি যখন আপনারও করা উচিত , অন্য ফাইলগুলি একই ডিরেক্টরিতে উপস্থিত থাকে তবে আপনি জানেন না বা লক্ষ্য করেননি এই সমস্যাটি তখনই দেখা দিতে পারে।

এটি ব্যবহার করা ভাল find, ট্যাব সম্প্রসারণ (নাম লিখতে শুরু করুন এবং টিপুন Tab), ফাইলের নাম সম্প্রসারণ [ 2 ] হিসাবে *MyKey*...


একটি দ্রুত সমাধান
যেহেতু আপনি "গুগল" ভিতরে থাকা সমস্ত প্যাকেজগুলি (যা সমাপ্ত .deb) নির্বাচন করতে চান আপনি ওয়াইল্ডকার্ডের মাধ্যমে আপনার অনুরোধটি তৈরি করতে পারেন এবং একটি সাধারণ কাজ করতে পারেন* *google*.deb

rm -i *google*.deb 

এটি মাঝের মধ্যে "গুগল" দিয়ে প্রতিটি ফাইলের নাম নির্বাচন করবে যা বর্তমান ডিরেক্টরিতে উপস্থিত হয়ে শেষ হবে । প্যারামিটার সম্প্রসারণের সাথে ফাইলগুলি মুছলে আপনি বিকল্পটি (ইন্টারেক্টিভ) নিশ্চিতকরণের জন্য অনুরোধ করবেন।.deb-i


আপনার প্রচেষ্টার দর্শন একটি সমাধান ঘনিষ্ঠ
আপনার উদ্দেশ্য, টুকরা পরে আপনার কমান্ড টুকরা তৈরী যাতে আপনি কাজ করেছেন হয় তাহলে ls, পরে ls | grep google, এবং শুধুমাত্র পরে আপনি আপনার আউটপুট চেক করা আপনি একটি subshell এটা নির্বাহ করতে পারেন $(...)সঙ্গে

rm -i $(ls | grep google)

একটি দ্রুত এবং আরও বিপজ্জনক উপায় [ 3 ] , হ'ল ব্যবহার করা!!

ls | grep google
rm -i $(!!)

এটি আপনার ইতিহাসে শেষ হওয়া কমান্ডটি কার্যকর করবে । আপনি নিজেকে এই সত্য থেকে রক্ষা করতে পারবেন যে শেল অপশনগুলির histverifyসাথে আপনি যদি আগে থেকে সক্ষম করে থাকেন তবে আপনি যে রেখার ব্যবহার করতে যাচ্ছেন তার কোনও ভিজ্যুয়াল নিয়ন্ত্রণ নেই shopt -s histverify


5
touch 0 1 2 3 4 5 6 7 8 9
find . -name \[0-9] -ok rm {} \;

< rm ... ./0 > ? y
< rm ... ./9 > ? y
< rm ... ./8 > ? y
< rm ... ./7 > ? y
< rm ... ./6 > ? y
< rm ... ./5 > ? y
< rm ... ./4 > ? y
< rm ... ./3 > ? y
< rm ... ./2 > ? y
< rm ... ./1 > ? y
^C

... -name '*c*.deb'পরিবর্তে আপনার জন্য উপযুক্ত হিসাবে ব্যবহার করুন বা অন্য কোনও প্যাটার্ন।


2

rmথেকে ইনপুট গ্রহণ করে না stdin। আপনার মতো কিছু করা দরকারls google-chrome* | xargs rm

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