প্রত্যাশার চেয়ে ওয়াইল্ডকার্ড সরানো উপায়ে অপ্ট-গেট রিমুভ করুন। কেন?


38

গত রাতে আমি সিডি জ্বালানোর চেষ্টা করছিলাম। কে 3 বি নিয়ে ক্ষুব্ধ হয়ে এর পরিবর্তে ব্রাসেরো ব্যবহার করা বেছে নিয়ে আমি কে 3 বি সরিয়ে ফেলতে গিয়েছিলাম।

আমি টাইপ করেছি:

sudo apt-get remove k3b

আমি দুবার ট্যাব টিপলাম এবং দেখলাম আমার সিস্টেমে আমার কাছে কে 3 বি এবং কে 3 বি-ডেটা রয়েছে। ধরে নিচ্ছি যে আমার সিস্টেমে কে 3 বি ছাড়া আমার কে 3 বি-ডেটার দরকার পড়বে না, আমি এটিও মুছে ফেলতে চেয়েছিলাম তাই টাইপ করে লিখেছিলাম:

sudo apt-get remove k3b*

দুর্ভাগ্যক্রমে আমি Y না আঘাত করে নিশ্চিত না করে। এটা তোলে চেয়ে আরো অনেক কিছুর সাথে আনইনস্টল k3bএবং k3b-data। এটি প্যাকেজগুলি আনইনস্টল করেছে যা আমার k3b*রেজেক্সে ফিট করে না । উদাহরণস্বরূপ: transmissionএবং network-manager

আমি মোটামুটি নিশ্চিত যে আমার মধ্যে কোনও স্থান ছিল না k3bএবং *তবে আমি জানি না কেন অন্যটি কেন এটি সমস্ত কিছু সরিয়ে ফেলবে। অ্যাপট-গেট সম্পর্কে এমন কিছু আছে যা আমি ভুল বোঝাবুঝি করছি?


উত্তর:


38

আপনি যে আদেশটি চান তা হ'ল sudo apt-get remove '^k3b.*'কারণ:

  • আপনার .*যে কোনও চরিত্র, কোনও সংখ্যক বারের সাথে মিল রাখতে হবে
  • আপনি প্রয়োজন ^স্ট্রিং এর শুরু মেলে
  • বাশকে *একটি ওয়াইল্ডকার্ড হিসাবে ব্যাখ্যা থেকে বিরত রাখতে আপনাকে রেজেক্সের উদ্ধৃতি দিতে হবে

(এই উত্তরটি কিবিবি এবং ফ্লিম দ্বারা সরবরাহিত পূর্ববর্তী তথ্যকে সংক্ষিপ্তসার ও সংক্ষিপ্তসার করে)


5
এটি নিরাপদ এবং এটি ব্যবহার করা ঠিক আছে তবে আপনার এটির দরকার নেই .*। আপনি শুধু ব্যবহার করতে পারেন sudo apt-get remove ^k3b। উপস্থিতি ^যথেষ্ট যুক্তি একটি রেগুলার এক্সপ্রেশন হিসেবে ব্যাখ্যা করা কারণ, এবং যখন aptবা apt-getব্যাখ্যা করে একটি রেগুলার এক্সপ্রেশন হিসাবে একটি আর্গুমেন্ট, এটা সাথে মেলে যে কোন জায়গায় প্যাকেজের নাম হবে। এজন্য আপনার দরকার ^- প্যাকেজের নাম শুরু হওয়ার সাথে ম্যাচটি অ্যাঙ্কর করতে। নিয়মিত অভিব্যক্তিটির পুরো প্যাকেজের নামের সাথে এটির কোনও অংশই মিলবে না।
এলিয়াহ

1
অতিরিক্ত তথ্যের জন্য এলিয়াকাগান থেক্স! (এবং প্রকৃতপক্ষে, এটি উপলব্ধি করে যে আপনার যদি প্রয়োজন হয় তবে আপনার প্রয়োজন ^হবে না .*)
বরিস ডালস্টাইন

30

নিয়মিত প্রকাশটি *শূন্য বা নির্বিচারে অনেকের জন্য দাঁড়িয়ে। সুতরাং আপনি যে কোনও সংখ্যার অনুসরণ করে apt-getযা কিছু মুছে ফেলতে বলেছিলেন , তাই মূলত যা রয়েছে তা সবই । যদি আমি আমার সিস্টেমে আপনার আদেশটি চেষ্টা করি তবে এটি 58 ​​টি প্যাকেজ মুছে ফেলতে চায়।k3bk3

sudo apt-get remove -s k3b*
Package k3b is not installed, so not removed
Package k3b-data is not installed, so not removed
Package k3b-dbg is not installed, so not removed
Package libcanberra-gtk3-0 is not installed, so not removed
Package libcanberra-gtk3-0-dbg is not installed, so not removed
Package libcanberra-gtk3-dev is not installed, so not removed
…
The following packages will be REMOVED:
  appmenu-gtk ardour audacity brasero brasero-cdrkit firefox-globalmenu
  gconf-editor gir1.2-appindicator-0.1 gnome-applets gnome-control-center
…
0 upgraded, 2 newly installed, 58 to remove and 0 not upgraded.

ইসস! আমি এই ছদ্মবেশী উইন্ডোজ মেশিনগুলিতে (যেখানে * কেবলমাত্র "এবং এর পরে কিছু" এর কাজ করা) আটকে গিয়েছি way
স্টিভ গোককোভিচ

14
*ডস মত ব্যাশ জন্য ওয়াইল্ডকার্ড হিসেবে কাজ করে, কিন্তু কিছু কমান্ড পছন্দ apt-getএকটি Regex আশা। আপনি যখন টাইপ করবেন sudo apt-get remove -s k3b*, বাশ প্রথমে আপনার বর্তমান ডিরেক্টরিতে শুরু হওয়া কোনও ফাইল সন্ধান করবে k3b। যদি এটি কোনও সন্ধান করে তবে এটি যুক্তিটি সেই ফাইলগুলির সাথে প্রতিস্থাপন করবে। যদি তা না হয় তবে এটি k3b*সরাসরি চলে যাবে apt-get, যা এটি একটি রেজেক্স হিসাবে ব্যাখ্যা করবে। আপনি যদি চান না যে বাশটিকে প্রথমে ওয়াইল্ডকার্ড হিসাবে ব্যাখ্যা করা (যা আপনি সম্ভবত করেন না), একক উদ্ধৃতি দিয়ে যুক্তিটি ঘিরে রাখুন:sudo apt-get remove -s 'k3b*'
ফ্লিম

3
সুতরাং উদ্দেশ্য কমান্ড হত sudo apt-get remove -s 'k3b.*'। এই উত্তরে কেবল হোঁচট খেয়েছে এবং এটি জানা গুরুত্বপূর্ণ find আইএমএইচও এটি বেশ অপ্রত্যাশিত এবং আমি এটিকে অ্যাপটি-গেটের একটি "অপ্রত্যাশিত আচরণ" বাগ হিসাবে চিহ্নিত করব ... আপনি সাধারণত "গ্লোব" অর্থ প্রত্যাশা করেন এবং নির্দিষ্ট না হলে "রেজএক্সপ্যাক্স" অর্থটি আশা করেন না। যাইহোক ধন্যবাদ এবং +1!
রোমানো

1
এবং আমার মতো যারা জানেন না তাদের জন্য: -sবিকল্পটির অর্থ "সিমুলেশন"। এটি apt-getঅপারেশন না করার জন্য বলে , তবে কেবল -sবিকল্প ছাড়া কী হবে তা আপনাকে অবহিত করতে বলে ।
বরিস ডালস্টেইন

আমি মনে করি গ্লোববিং তৈরি করতে আপনার একক উদ্ধৃতি ব্যবহার কমপক্ষে পুতুলের জন্য কার্যকর হয় না। এবং তা অপ্রত্যাশিত। 'ফাইন্ড' প্রোগ্রামে, যদি আমি সন্ধান / -iname 'প্রকল্প * লিখি তবে আমি প্রকল্পের সাথে শুরু হওয়া সমস্ত কিছুই খুঁজে পাব, এর মধ্যে' প্রকল্প 'আছে এমন কিছু নয় এবং এর পরেও কিছু হবে। পুতুল সম্পর্কিত প্রমাণ হিসাবে, লক্ষ্য করুন যে কীভাবে আমার ফলাফলগুলি 'রেজেক্স' বলে এবং ফলাফলগুলি এটি প্রমাণ করে?
ডেনিস

9

sudo apt-get remove ^k3bপরিবর্তে ব্যবহার করুন। আপনি যখন প্যাকেজগুলি ইনস্টল বা সরান, *প্রায়শই বিপজ্জনক এবং খুব কমই প্রয়োজন হয়। আপনি যদি এটি ব্যবহার করেন তবে আপনার *এটি উদ্ধৃত করা উচিত, তবে এটি এটি নিরাপদ করে না কারণ আপনার ইচ্ছার চেয়ে অনেক বেশি প্যাকেজ নির্বাচন করার প্রবণতা হ'ল উপায় aptএবং এর apt-getব্যাখ্যা এবং পথের নাম প্রসারণের প্রভাব নয়

  • এমনকি নিরাপদ ব্যবহারের* হয় প্রায়ই অপ্রয়োজনীয়
  • অনিরাপদ ব্যবহারগুলি নৃশংস । অপসারণটি তার নামে k3b*যে k3 কোনও প্যাকেজ (এবং এমন প্যাকেজের উপর নির্ভর করে এমন প্রতিটি প্যাকেজ) মুছে ফেলে । এটা একটা টাইপো নয় - ধারণকারী k3যথেষ্ট, এমনকি ছাড়া b, কারণ b*মানে হলো "শূন্য বা তার বেশি bগুলি।"

আপনি চালাতে যখন aptবা apt-getসঙ্গে install, removeঅথবা purgeকর্ম, প্রতিটি পরবর্তী যুক্তি প্রথম 1 একজন ব্যক্তির প্যাকেজ নাম হিসেবে ব্যাখ্যা। যদি সেই সঠিক নামের একটি প্যাকেজ উপস্থিত থাকে তবে এর জন্য ক্রিয়াটি সম্পাদিত হবে।

যদি এমন কোন প্যাকেজ, aptএবং apt-getযুক্তি সাধারণ কোন থাকে চেক করবে রেগুলার এক্সপ্রেশন metacharacters 2 . , ?, +,* , |, \[, ^, অথবা$ । যদি তা না হয় তবে এটি শেষ হয়েছে - কোনও প্যাকেজ পাওয়া যায় নি।

এটিতে যদি এই অক্ষরগুলির কোনও থাকে তবে তা নিয়মিত প্রকাশ হিসাবে বিবেচনা করা হবে এবং কোনও প্যাকেজের নামের কোনও অংশের সাথে মিলে যায় । এটি পুরো নামের সাথে মেলে না। অন্যদের বলেছি, *একটি রেগুলার এক্সপ্রেশন হিসেবে একই জিনিস মানে এই নয় *একটি উল্লিখিত glob হবে। ?হয় না। একটি নিয়মিত প্রকাশে:

  • *পূর্ববর্তী আইটেমটি ঠিক একবারের পরিবর্তে - একবারে বা একেবারে নয় - যে কোনও সময় প্রদর্শিত হতে দেয় ।
  • ?পূর্ববর্তী আইটেমে তোলে ঐচ্ছিক --that হয়, এটা শূন্য বা এক বার প্রদর্শিত করতে পারবেন।

apt-get (8) ( man apt-get) বলেছেন:

যদি কোনও প্যাকেজ প্রদত্ত এক্সপ্রেশনটির সাথে মেলে না এবং এক্সপ্রেশনটিতে একটি '।', '? বা '*' তারপরে এটি একটি পসিক্স নিয়মিত এক্সপ্রেশন হিসাবে ধরে নেওয়া হয় এবং এটি ডাটাবেসের সমস্ত প্যাকেজের নামের জন্য প্রয়োগ করা হয়। এরপরে যেকোন ম্যাচ ইনস্টল করা (বা সরানো) হয়। নোট করুন যে ম্যাচটি 'লো। *' ম্যাচগুলি 'হাও-লো' এবং 'সর্বনিম্ন' এর সাথে বিস্তৃত করে সম্পন্ন হয়। যদি এটি অনাকাঙ্ক্ষিত হয় তবে নিয়মিত এক্সপ্রেশনটি একটি 'or' বা '$' চরিত্রের সাথে অ্যাঙ্কর করুন বা আরও নির্দিষ্ট নিয়মিত এক্সপ্রেশন তৈরি করুন।

র manpage শুধুমাত্র উল্লেখ ., ?এবং *, কিন্তু এটা অসম্পূর্ণ , যেমন +, |, [, ^, এবং $এছাড়াও যাক যথেষ্ট apt-getবা aptএকটি রেগুলার এক্সপ্রেশন হিসাবে প্যাটার্ন ব্যাখ্যা। 3

যদিও আপনি যে কোনও অক্ষরের সাথে সংখ্যার সাথে মিল রাখতে পারেন .*- শুধু নয় - *এটি আপনার নিয়মিত প্রকাশের মাঝামাঝি সময়ে উপস্থিত হলেই কেবল এটির প্রয়োজন । যেহেতু প্যাকেজ নামের কোনও স্ট্রিংয়ের সাথে প্যাটার্নটি মিলছে, এটি নিদর্শনটির শেষে (বা শুরু) অর্থহীন।

ম্যানপেজটি উল্লেখ করেছে ^এবং$ । এই (বিশেষ করে ^) সাথে ব্যবহারের জন্য নিরাপদ, দক্ষ নিদর্শন লেখার চাবিকাঠি install, removeঅথবা purgeমধ্যে ক্রিয়া aptবা apt-get

  • ^পুরো স্ট্রিংয়ের শুরুতে নিয়মিত অভিব্যক্তি অ্যাঙ্কর করে । ^k3bযার নাম দিয়ে শুরু হয় এমন সমস্ত প্যাকেজ নির্বাচন করে k3b
  • $পুরো স্ট্রিংয়ের শেষে একটি নিয়মিত ভাব প্রকাশ করে ors k3b$সমস্ত প্যাকেজ যাদের নাম নির্বাচন হবে শেষ সঙ্গে k3b

অতএব আপনি নিরাপদে প্যাকেজগুলি অপসারণ করতে এই আদেশটি ব্যবহার করতে পারেন:

sudo apt-get remove ^k3b

অবশেষে, আপনি যে নির্দিষ্ট ক্ষেত্রে উল্লেখ করেছেন, আপনি পাশাপাশি দুটি নাম নিজেই পাস করতে পারেন:

sudo apt-get remove k3b k3b-data

তাহলে আপনি এই সমস্ত জটিলতা এড়ানো! (যদিও ^এটি ব্যবহারের পরে একবারে অ্যাঙ্করিং করা সহজ)) বা ব্রেস প্রসারণ ব্যবহার করুন , যা আপনার শেল উপরের কমান্ডটিতে প্রসারিত:

sudo apt-get remove k3b{,-data}

1 এই দুটি ব্যতিক্রম রয়েছে: (ক) কিছু অপশন (যেমন, -f, --purge) স্বীকৃত হয়, এবং (খ) কিছু যতিচিহ্ন এ প্রকাশমান অক্ষর শেষ একটি আর্গুমেন্ট অন্যথায় ক্রিয়াটি হতে পারে একটি প্যাকেজের নাম হিসাবে গ্রহণ করা হবে যা করা হয় তার পরিবর্তনের জন্য ব্যবহৃত হয় (উদাহরণস্বরূপ, প্যাকেজের পরিবর্তে টাস্কটিsudo apt install ubuntu-desktop^ ইনস্টল করে এবং শেষে প্রদর্শিত হবে)।^

2 অন্যান্য নিয়মিত এক্সপ্রেশন মেটাচার্যাক্ট উপস্থিত। উদাহরণস্বরূপ, \নিয়মিত প্রকাশের সমস্ত উপভাষা দ্বারা সমর্থন করা হয় এবং সাধারণত ব্যবহৃত হয়। ., ?, +, *, |, [, ^, এবং $মাত্র metacharacters এপিটি ডেভেলপারদের একটি রেগুলার এক্সপ্রেশন হিসাবে ব্যাখ্যা আরম্ভ সিদ্ধান্ত নিয়েছে হতে ঘটতে (নামে একটি সঠিক প্যাকেজ হিসাবে রেজল্যুশন পর ব্যর্থ হয়েছে)।

3 এটি যাচাই করার সহজতম উপায় হ'ল -sউপরে বর্ণিত বিকল্পটি ব্যবহার করে এ জাতীয় প্যাটার্ন দিয়ে ইনস্টলেশন বা অপসারণের অনুকরণ করা । উদাহরণস্বরূপ, চলমান apt -s install ^virtualboxশোগুলি যার sudo apt install ^virtualboxপ্রতিটি প্যাকেজ ইনস্টল করার চেষ্টা করার প্রভাব ফেলবে প্যাকেজ ম্যানেজার কার নাম দিয়ে শুরু হবে তা জানে virtualbox। তবে এই আচরণটি উত্স কোড পরীক্ষা করেও যাচাই করা যেতে পারে । পরীক্ষা করে দেখুন CacheSetHelper::PackageFromRegExফাংশন cacheset.cc


1

এরপরে আপনি সম্ভবত এমন একটি লাইব অপসারণ করতে পারেন যা সেই প্রোগ্রামগুলিতে নির্ভর করে k

সংক্ষেপে আপনি কখনই জানেন না। আমি জিনিসগুলি সরানোর জন্য কোনও ওয়াইল্ডকার্ড ব্যবহার না করার এবং অনুরোধ করার সময় জিনিসগুলি পড়ার পরামর্শ দিচ্ছি (দুঃখিত)।

এছাড়াও -n রেজেক্স অনুসন্ধানগুলি কেবলমাত্র নাম নয় সমস্ত ক্ষেত্র ব্যবহার করে

http://ccrma.stanford.edu/planetccrma/man/man8/apt-cache.8.html

কিবিবিও ঠিক আছে আপনার রেজেক্সটি গেট-গো থেকে ত্রুটিযুক্ত


অন্য একটি জিনিস, আপনার (কে 3 বি এবং কে 3 বি ডেটা) এর মতো ক্ষেত্রে কেবল কে 3 বি আনইনস্টল করুন। এপ্ট তারপরে আপনাকে অবহিত করবে যে আপনার যদি এমন কিছু ইনস্টল থাকে যা আপনার আর প্রয়োজন নেই এবং সেগুলি সরাতে আপনার কী করা উচিত।
কোটায়ার

কি দারুন! আমি বর্ণনার মধ্যেও এটি অনুসন্ধান করার আশা করিনি! হ্যাঁ, এটি অবশ্যই এমন কিছু যা আমি আর কখনও করব না! (এবং আমি পরের বার জিনিসগুলি পড়ার বিষয়টি নিশ্চিত করব: পি)
স্টিভ গোকোভিচ

লিঙ্কটি নষ্ট হয়ে গেছে, কীভাবে -n ব্যবহার করবেন তা স্পষ্ট করে মনে করবেন?
Seanny123

-n মানে কেবলমাত্র নামের ক্ষেত্রে অনুসন্ধান করা।
কোটায়ার

চেষ্টা করার পরে, -n বিকল্পটি apt-get removeকেবলমাত্র দ্বারা স্বীকৃত নয় apt-get cacheapt-get removeদেখে মনে হচ্ছে আসলে, কেবল প্যাকেজের নাম অনুসন্ধান করে, বিবরণ নয়।
বরিস ডালস্টেইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.