مهدی
مهدی
خواندن ۱۳ دقیقه·۳ سال پیش

جستجو بین ۶۰۰۰۰ بسته در دبیان

نصب و استفاده از سیستم عاملی که ۶۰۰۰۰ بسته قابل نصب و استفاده برای آدم داره خیلی جذابه. مخازن دبیان تقریبا میشه به جرعت گفت بزرگ ترینِ مخازن بین توزیع های دیگه هستند. دبیان تقریبا برای هر کاری کمِ کم یه بسته رو داره ( که توسط بزرگ ترین سرمایه دنیای نرم افزار متن باز و آزاد، توسعه دهنده های داوطلب و گروه ها نرم افزاری از همه جای دنیا نوشته شدن. ) اما پیدا کردن بسته ای که به دردمون بخوره از بین ۶۰۰۰۰ تا بسته میتونه خیلی سخت باشه!! سخت تر اینکه این بسته خاص، خیلی مشهور نباشه که بشه مثلا با یه سرچ ساده توی اینترنت پیداش کرد و غیره و ذالک.

نبود راه های مناسب و قوی برای جستجو بین بسته ها ( و پیدا کردن ابزاری که مورد نیازه ) از بین این همه بسته یکی از مشکلاتی بوده که در گذشته وجود داشته و خوشبختانه این مشکل به کلی بر طرف شده و ابزار های قوی و بسیار خوبی برای این کار توسعه داده شدن :)



بی اهمیت ترین روش جستجویی که وجود داره، جستجو برای اسم دقیق یه بسته‌ست :| یعنی اگر

apt show package

جواب بده، خب اون بسته وجود داره و میشه ازش استفاده کرد. اما متاسفانه در این روش یا باید نام کامل بسته رو از قبل بدونید یا اینکه حدس بزنید که همیشه ممکن نیست!

یک الگوی جستجوی کمی موفق تر اینکه بیایم یک جستجو plain-text رو بر اسم بسته ها اعمال کنیم ( منظور از این جستجو plain-text این هست که از regular expressions برای داده متنی استفاده میشه مثلا موقع جستجو بگیم که کلمه lib یا کلمه python اول اسم بسته باشه و یا اصطلاحا keyword search انجام بدیم ) که البته خیلی محدوده. اگر بخواهیم باز هم قدرت سرچ‌مون رو بیشتر کنیم میایم و این جستجوی plain-text رو روی توضیحات بسته ( description ) که در کنترل فایل اون بسته هست هم اعمال کنیم. چون این توضیحات دارای کلمات بیشتر هستن پس جستجو ما موفق تر خواهد بود. پس گام اول ما جستجوی کلمات کلیدی ( keyword search ) خواهد بود

جستجو کلمات کلیدی

از اونجایی که هر بسته کم و بیش توضیحاتی رو با خودش همراه داره این الگوریتم جستجو معمولا مفید واقع میشه و ما رو به بسته های مورد نیازمون میرسونه! :) دو ابزارِ apt-cache و axi-cache برای این نوع جستجو ساخته شدن!

دستور apt-cache
این دستور میتونه اطلاعات بسیاری رو از دیتابیس درونی APT برای ما جستجو و نمایان کنه. این اطلاعات نوعی حافظه کش ( معادل اش پنهان میشه cache ) هستن که از منابع مختلفی که در sources.list نام برده شدن، جمع آوری میشن. این جمع آوری زمانی اتفاق میوفته که شما دستور apt update رو اجرا میکنید.

این دستور میتونه یک جستجو بر مبنای کلمات کلیدی برای ما انجام بده. فرمت جستجو هم به اینگونه است:
apt-cache search keyword

این دستور همچنین میتونه هدر ( header ) های بسته ها رو هم با دستور apt-cache show package به ما نشون بده. این دستور همون کنترل فایل رو برای ما میخونه
توجه کنید که دستور های:
apt search, apt show, aptitude search, aptitude show هم یکسان کار میکنند.

دستور apt-cache کاربرد های بسیار دیگه ای هم داره که معروف ترین هاشون در تصویر زیر هستن

برای مثال apt-cache search xserver-xorg-video این نتایج رو داره:

برای اطلاعات بیشتر و کامل تر به منوآل پیج ( man page ) این دستور مراجعه کنید :‌ man apt-cache
دستور axi-cache
ابزار apt-cache یک ابزار جستجوی خیلی ابتدایی هست. اساسا تنها کاری که این بسته برای جستجو انجام میشه اینکه بر روی توضیحات و اسامی پکیج ها یک grep انجام میده و اون هایی که مچ ( match ) شدن رو به ما بر می‌گردونه. این دستور بعضی وقت ها یا نتایج بسیاری رو برامون میاره یا هیچی پیدا نمیکنه‌ :(

اما دستور axi-cache search term نتایج خیلی بهتری رو مرتب شده بر اساس میزان ارتباط نتایج با جستجوی شما رو ارائه میکنه. این دستور از موتور جستجوی Xapian که جزئی از apt-xapian-index هست استفاده میکنه! این دستور از tag های بسته ها ( این تگ ها رو در ادامه به طور مفصل بررسی خواهیم کرد ) اطلاع داره و در چند میلی ثانیه نتایج رو برمی‌گردونه ( دیگه چی از این بهتر :)) )

برای جستجو های پیچیده تر و بهتر ابزار قوی تر هم نیاز هست، اینجاست باید از aptitude افسانه‌ای رو نمایی کرد. aptitude به شما این اجازه رو میده که جستجو هایی بر پایه عبارات منطقی ( logial expression ) بر روی فیلد های meta-information بسته ها انجام بدید ( همان فایل افسانه‌ای که در این مقاله در موردش صحبت کردیم :) )


برای نصب این ابزار:

$ sudo apt install aptitude --install-suggests

اول یک مثال بزنیم و بعدش راجع به این عبارات منطقی صحبت کنیم :

جستجوی ما بسته هایی رو برگردونده که در توضیحات‌شون ( description ) کلمه video وجود داشته و تگ use::storing رو داشته اند.

حالا بیاید تا این عبارات منطقی رو یاد بگیریم ( اینجا من دونه دونه عباراتی که میشه استفاده کرد رو با یک مثال به شما نشون میدم ) :


?not(pattern), !pattern

این عبارت هر چیزی که بهش پاس بدید رو نفی و یا منفی میکنه مثال:

نگاه کنید ما تمام بسته هایی رو الان داریم که هیچ کدوم از حروف a تا w در اون ها نیست و همینطور که میبینید این عبارات میتونن از regular expressions پشتیبانی کنن پس اگه بلد هستید میتونید حرفه ای تر سرچ کنید.


?action(action), ~aaction

بسته هایی رو انتخاب کنید که به عنوان action علامت گذاری شدن.
این اکشن ها : install, upgrade, downgrade, remove, hold, و یا keep هستن. توجه کنید که این عبارت فقط بسته هایی رو انتخاب میکنه که برای این کار ها انتخاب شده باشن و نه اینکه امکان این هارو داشته باشن، برای مثال upgrade اونهایی رو نشون میده که شما برای بروزرسانی انتخاب کردید و نه اون هایی که میش بروزرسانی شون کرد ( برای اینکار از upgradable? باید استفاده کنید. )

این ها بسته هایی اند که برای حذف شدن انتخاب شدن چون در قسمت autoremove هستن.


?and(pattern1, pattern2), pattern1 pattern2

همین‌طور که از اسمش بر میاد، عملگر and بررسی میکنه که ایا هر دو برقرار اند یا خیر.

توی این مثال تنها بسته ای که توی اسمش ( n~ عبارتی هست که چک میکنه آرگومانی که میگیره آیا توی اسم بسته هست یا نه ) هم obs باشه و هم studio

?or(pattern1, pattern2), pattern1 | pattern2

باز هم همینطور که از اسم بر میاد این عملگر میگه یا این یا اون یا هر دوش :)

این کار همه بسته هایی که هستن رو نشون میده :) اما تعجب نکنید چون بسته های مجازی رو هم نشون میده این عدد هست.

تعداد کل بسته های قابل نصب ( که الان در کش سیستم من هستن ):


?all-versions(pattern); ?any-version(pattern)

باز هم اسامی این عبارات گویای همه چیز هستن، all-versions میاد چک میکنه که بسته ای تمامی ورژن هاش این الگویی که بهش دادید براشون صدق میکنه یا نه. با این عبارت aptitude ورژن های بسته رو جدا جدا و پشت سر هم تست میکنه؛ نکته قابل توجه هم اینکه بسته هایی که ورژن ندارن، مثل بسته های مجازی virtual package همیشه توسط این عبارت تایید و برگردانده میشن!

مثال رو نگاه کنید بسته اولی یک بسته معمولی هست اما دومی که یک بسته مجازی هست ( اون v رو بقلش نگاه کنید ) هم برگردانده شده!

اما any-version بسته هایی رو نشون میده که حداقل یکی از ورژن هاش با الگو صدق کنه!


?architecture(architecture-spec), ~rarchitecture-spec

بسته هایی را برمیگرداند که برای معماری architecture هستن، برای مثال “architecture(amd64)?” بسته هایی که برای این معماری هستن رو نشون میده اما "architecture(all)?” بسته هایی رو بر میگردونه که تمام معماری ها رو ساپورت میکنن:


?archive(archive), ~Aarchive

بسته هایی رو انتخاب میکنه که در آرشیوی که بهش دادید ( برای مثال “archive(testing)?” بسته هایی که در آرشیو تستینگ قرار دارن رو انتخاب میکنه ) وجود دارن.

?automatic, ~M

این دستور بسته هایی که به صورت خودکار نصب شدن رو نشون میده، موقع نصب یک بسته ممکنه که APT برای اون بسته ایی رو نصب کنه، بسته هایی که در فیلد پیشنیاز ها، قید شدن اما روی سیستم نیستن، یا بسته های فیلد recommends. این به شما کمک میکنه که این بسته ها رو پیدا کنید.

بسته های که هنگام نصب libreoffice به صورت خودکار نصب شدن و در اسمشون libreoffice-help وجود داره


?broken, ~b

این دستور بسته هایی رو برای شما میاره که خراب شدن، حالا یا پیش نیازشون نیست، یا پیش-پیشنیازشون نیست و یا تعارضی با بسته های دیگر دارن.


?broken-depType, ~BdepType

عبارت قبلی یه عبارت کلی هست و همه بسته های خراب رو نشون میده. حالا تصور کنید من در یک موقعیت خاص میخوام فقط بسته های خرابی رو پیدا کنم که مثلا فیلد recommends‌شون یه مشکلی داره یا مثال فیلد pre-depends. اما عبارت broken-deptype? برای اینکار به کمک ما میاد!

در این جستجو ما بسته هایی که فیلد recommends شون یه مشکلی داره و تگ devel::editor هم دارن!


?conflicts(pattern), ~Cpattern

بسته هایی رو پیدا میکنه که با بسته هایی که با الگوی داده شده همخوانی دارن، تعارض ایجاد میکنن

اینجا بسته هایی رو پیدا کردیم که با بسته هایی که این فیلد رو در کنترل فایل خودشون دارن

Maintainer: Debian Multimedia Maintainers <debian-multimedia@lists.debian.org>

تعارض ایجاد میکنن!


?config-files, ~c

این یه عبارت جالبه. در دبیان میتونیم بسته ها رو به دو صورت حذف کنیم، اول اینکه با دستور apt remove حذفشون کنیم، این حذف کردن صرفا فایل های خود بسته رو حذف میکنه اما یک سری فایل های meta-info از پکیج روی سیستم باقی میمونن، در این مقاله کامل راجع بهشون صحبت کردم. اما حالت دوم اینکه تمام چیز هایی که به فایل مربوط میشه رو با دستور apt purge حذف و به اصطلاح complete removal انجام بدیم. حالا بیاد فرض کنیم ما چندین بسته رو از سیستم صرفا remove کردیم و میخوایم ببینیم چه بسته هایی اینجور حذف شدن . اینجاست که از این عبارت استفاده میکنیم.

من قبلا این بسته رو حذف کرده بودم و می‌بینید که برام برگردانده!


?depType(pattern), ~D[depType:]pattern

این دستور یکی از دستور هایی هست که خیلی دوستش دارم، بسیار قدرتمنده و میشه خوب ازش استفاده کرد. این دستور رو با مثال توضیح میدم،‌ فرض کنیم که میخواهیم بسته هایی رو پیدا کنیم که xserver-xorg-video-radeon یکی از پیشنیاز هاشون هست، خب میایم و اینجور ازش استفاده میکنیم: (در حالت کوتاه دستوری اگر جلو D چیزی ننویسیم به صورت پیش فرض depends رو جستجو میکنه)

این عبارت قدرتمند از تمامی فیلد هایی زیر پشتیبانی میکنه:

depends”, “predepends”, “recommends”, “suggests”, “breaks”, “conflicts”, “replaces” و همچنین provides

اگر از provides استفاده کنید،‌دستور بسته های ارائه شده ( provides ) رو با الگوی ( pattern ) داده شده مچ تطبیق میده و بسته ای که اون رو ارائه میکنه رو بر میگردونه:

برای مثال نتایج برگردانده شده بسته هایی اند که در فیلد provides شون mail-transport-agent رو دارا هستن :


?description(description), ~ddescription

بسته هایی رو پیدا میکنه که در توضیحات اون ها description وجود داشته باشه و نکته اینکه جستجو با این عبارت به صورت regex هست :)

خب فرض کنید من با زبان perl کار میکنم و میخوام یک ادیتور پیدا کنم، خب از تگ devel::editor استفاده میکنم و بین ادیتور هایی جستجو میکنم که در توضیحاتشون کلمه perl بکار رفته باشه. حالا فرض کنیم دنبال یک IDE میگردیم خب خیلی ساده‌ست فقط از تگ devel::ide باید استفاده کنیم:

در قسمت توضیحات از Perl هم صحبت شده

?essential, ~E

بسته های essential رو انتخاب میکند. این بسته ها آن هایی هستن که در کنترل فایل آنها فیلد Essential: yes وجود داشته باشد:

?installed, ~i

بسته هایی رو انتخاب میکنه که در سیستم نصب شده اند:

?maintainer(maintainer), ~mmaintainer

بسته هایی رو انتخاب میکنه که در فیلد maintainer شون اون چیزی که بهش پاس دادید وجود داشته باشه ، و مثل دستور d~ از regex استفاده میکنه:


?multiarch(multiarch)

بسته هایی رو انتخاب میکنه که قابلیت پشتیبانی از چند معماری رو دارن، برای مثال:

این بحث رو بهتره راجع بهش جستجو کنید تا متوجه بشید که آیا بسته هایی از معماری X در دبیان میتونن در معماری Y نصب بشن و چگونه میشه این کار رو کرد،‌ به عنوان یک مثال دیگه multiarch(none)?این دستور بسته هایی رو انتخاب میکنه که قابلیت پشتیبانی از چند معماری رو ندارن. دبیان سیستم عاملی هست که طیف بسیار وسیعی از معماری هارو پشتیبانی میکنه و یکی از ویژگی های قدرتمند این سیستم عامل هست.


?name(name), ~nname

بسته هایی رو انتخاب میکنه در اسم شون با regex چیزی مچ باشه:


?obsolete, ~o

بسته های نصب شده ای رو انتخاب میکنه که دیگر از هیچ یک از آرشیو های دبیان قابل دانلود نیستن


?origin(origin), ~Oorigin

بسته هایی رو انتخاب میکنه که origin اون ها با origin داده شده و با regex مطابقت کنه، برای مثال برای اینکه بخواهیم بسته هایی رو پیدا کنیم که از دبیان نیستن و اصطلاحا غیررسمی اند و روی سیستم نصب هستن اینجور مینویسیم:

!?origin(debian)

البته اگه این دستور رو بنویسید که بسته هاب رو سیستم شما نباشه که از دبیان نباشه، تمام بسته های مجازی رو بر میگردونه :|


?provides(pattern), ~Ppattern

این دستور تمام بسته هایی رو برمیگردونه که بسته ای که بهش میدید رو ارائه ( provide ) میکنن

?priority(priority), ~ppriority

بسته هایی رو پیدا میکنه که یکی از اولویت های :‌

extra, important, optional, required, standard

رو دارا هستن.


?tag(tag), ~Gtag

و می رسیم به یکی از مهم ترین عبارات و قوی ترین هاشون. بله تگ های بسته ها
این تگ های برای مرتب کردن بسته ها بکار میرن و یکی از بهترین ابتکار ها برای مرتب کردن و جستجو بین اون ها هستن. برای اینکه از این تگ ها به خوبی استفاده کنید اول اول اول باید manual page مربوط به بسته debtags رو مطالعه کنید. بعد از اینکه با خود این بسته و دستور هاش آشنا شدید، اول این کار رو بکنید:

$ debtags tagcat > AllDebTags

این دستور تمام تگ هایی که برای بسته ها استفاده شدن رو بهتون میده. بریم یه سر به خودش بزنیم:

اولین خط هاd این فایل رو نگاه کنید. اول بگم که فایل خیلی بلندی هست :) دوم اینکه تگ ها دو قسمت دارن یکی صورت ( Facet ) و دوم خود تگ، نحوه استفاده ازشون هم اینطور هست که توی خط ۶ می‌بینید. ابتدا صورت رو وارد میکنیم و با دو تا : خود تگ رو جلوش نام میبریم، بعضی وقت ها هم مثل همون خط ۶ باز هم از : استفاده میشه.

برای اینکه با تگ ها اشنا بشید، از هر Document viewer یا text editor ی که استفاده میکنید، به قسمت find برید و همون کلمه Facet رو جستجو کنید، این کار برای اینکه با هر نتیجه بعدی شما به سری بعدی تگ ها میرید :)

حالا چند تا مثال با هم ببینیم.

فرض کنید میخواهیم ببینیم که چه ابزار های monitoring روی سیستم ما نصب هست خب خیلی راحت از تگ admin::monitoring و از i~ برای فیلتر کردن بسته های نصب شده استفاده میکنیم:

یا مثلا دنبال یک ادیتور برای زبان جاوا هستم و میخوام که با زبان ++C نوشته شده باشه:

خط اول رو نگاه کنید، برای اینکه از چند تا تگ در یک جستجو استفاده کنیم، هر بار باید G~ رو اسفاده کنیم.

دب تگ ها بسیار زیاد اند و میتونن خیلی به شما موقع جستجو کمک کنن، Facet ها و تگ هارو ببینید و سعی کنید یک تصویری از مهم هاشون ( اون هایی که به کار شما میان ) داشته باشید که موقع جستجو بهتر بتونید فیلتر انجام بدید. و این رو هم بیاد داشته باشید که مثل تمام ساخته های انسان هیچ چیزی کامل نیست و ممکنه بعضی بسته ها تگ های کمی داشته باشن و تگ هاشون اونقدر ها به درد نخورن و برای همین فقط به تگ ها اتکا نکنید و موقع جستجو از آپشن های مختلف حتما استفاده کنید.


?upgradable, ~U

این دستور بسته هایی رو برمیگردونه که میتونن آپگرید بشن.


?virtual, ~v

این دستور هم بسته هایی رو برمیگردونه که بسته هایی مجازی اند.

برای مثال :virtual?reverse-provides(?installed)?

تمام بسته های مجازی ای رو برمیگردونن که توسط بسته های نصب شده ارائه ( provide ) میشن.



یقینا نتونستم تمام این عبارات رو توی این مقاله بگذارم، اما نزدیکه به ۸۰٪ اون ها رو که خودم هم ازشون استفاده کرده بودم رو توضیح دادم. امیدوارم از الان به بعد خیلی راحت تر و بهتر به چیزی که نیاز دارید دسترسی پیدا کنید و از توزیع های دبیان بیس و مخازن بزرگ و گران بها شون نهایت استفاده رو ببرید.

مهم ترین documentation ی که من ازش استفاده کردم، مستندات خود aptitude هست که از آدرس

/usr/share/doc/aptitude/html/

قابل دسترسی هست و با دستور

$ firefox /usr/share/doc/aptitude/html/en/index.html

میشه توی مرورگر اون رو خوند.



شاد باشید :)


جستجوتنایج جستجولینوکسدبیانآموزش
سلام، من مهدی‌ام، مطالعه‌ی تخصصیم پایتونه و هر از چندی یه مقاله راجع به پایتون می‌نویسم
شاید از این پست‌ها خوشتان بیاید