การค้นหาปกติหรือการค้นหาไวด์การ์ด


12

เอกสาร Fedora พูดว่า:

5.2 การค้นหาขั้นสูง

หากคุณไม่ทราบชื่อของแพ็คเกจให้ใช้การค้นหาหรือระบุตัวเลือก หรือใช้ไวด์การ์ดหรือนิพจน์ทั่วไปด้วยตัวเลือกการค้นหายำเพื่อขยายขอบเขตการค้นหา

ตอนแรกฉันคิดว่านี่เป็นสิ่งที่ผิดหรือล้าสมัยเนื่องจากไม่มีไวยากรณ์ที่รู้จักของนิพจน์ทั่วไปที่จะใช้งานได้yum searchแต่จากนั้นฉันก็พบสิ่งนี้ : yum search [cl-*]ตัวอย่างเช่น แต่มันจะทำอะไรบางอย่างอย่างอื่น พบสิ่งที่ไม่มีตัวอักษร "c" หรือ "l" ในชื่อหรือคำอธิบาย (สิ่งที่ฉันต้องการคือการหาแพคเกจทั้งหมดที่มีชื่อจะถูกจับคู่โดยcl-.*regexp

ฉันยังพบว่ามีคนไม่กี่คนที่แนะนำให้ผลลัพธ์ของไปป์ยำgrepซึ่งแน่นอนแก้ปัญหา แต่โดยหลักการแล้วฉันต้องการค้นหาสิ่งที่ทำในวงเล็บเหลี่ยมทำอะไร ถ้าหากyumสามารถค้นหาได้โดย regexp ล่ะ

คำตอบ:


13

ค้นหาด้วย YUM

โดยทั่วไปคุณจะไม่ใช้นิพจน์ทั่วไป (globs) ใด ๆ เมื่อค้นหาด้วยyum searchเนื่องจากคำสั่งsearchค้นหาสตริงย่อยภายในชื่อแพ็กเกจและข้อมูลสรุป ฉันจะรู้สิ่งนี้ได้อย่างไร yum searchมีข้อความที่จะบอกคุณนี้เมื่อคุณใช้เป็น

การจับคู่ชื่อและการสรุปเท่านั้นใช้ "ค้นหาทั้งหมด" สำหรับทุกสิ่ง

หมายเหตุ:สตริง[cl-*]นั้นเป็นเทคนิค glob ในเปลือก Bash

searchดังนั้นคุณมักมองหาชิ้นส่วนของสตริงที่คุณต้องการด้วย นิพจน์ทั่วไปจะปรากฏขึ้นเมื่อคุณกำลังมองหาแพ็คเกจที่ต้องการ เหล่านี้เป็นคำสั่ง YUM ชอบและlistinstall

ตัวอย่างเช่น:
$ yum list cl-* | expand
Loaded plugins: fastestmirror, langpacks, refresh-packagekit, tsflags
Loading mirror speeds from cached hostfile
 * fedora: mirror.dmacc.net
 * rpmfusion-free: mirror.nexcess.net
 * rpmfusion-free-updates: mirror.nexcess.net
 * rpmfusion-nonfree: mirror.nexcess.net
 * rpmfusion-nonfree-updates: mirror.nexcess.net
 * updates: mirror.dmacc.net
Available Packages
cl-asdf.noarch                  20101028-5.fc19                 fedora          
cl-clx.noarch                   0.7.4-4.3                       home_zhonghuaren
cl-ppcre.noarch                 2.0.3-3.3                       home_zhonghuaren

ข้อแม้เดียวที่คุณจะต้องระมัดระวังกับ regexes / globs cl-*คือถ้ามีไฟล์ที่อยู่ในเปลือกของคุณที่มีชื่อดังกล่าวว่าพวกเขาก็จะตรงกับ ในกรณีเหล่านี้เชลล์ของคุณจะขยาย regex / glob ก่อนที่จะถูกนำเสนอต่อ YUM

ดังนั้นแทนที่จะทำงานyum list cl-*คุณจะใช้คำสั่งyum list cl-fileถ้ามีไฟล์ที่ตรงกับ cl-*regex

ตัวอย่างเช่น:
$ ls cl-file
cl-file

$ yum list cl-*
Loaded plugins: fastestmirror, langpacks, refresh-packagekit, tsflags
Loading mirror speeds from cached hostfile
 * fedora: mirror.steadfast.net
 * rpmfusion-free: mirror.nexcess.net
 * rpmfusion-free-updates: mirror.nexcess.net
 * rpmfusion-nonfree: mirror.nexcess.net
 * rpmfusion-nonfree-updates: mirror.nexcess.net
 * updates: mirror.steadfast.net
Error: No matching Packages to list

คุณสามารถป้องกันเหตุการณ์นี้ได้โดยหลีกเลี่ยงสัญลักษณ์แทนดังนี้:

$ yum list cl-\* | expand
Loaded plugins: fastestmirror, langpacks, refresh-packagekit, tsflags
Loading mirror speeds from cached hostfile
 * fedora: mirror.dmacc.net
 * rpmfusion-free: mirror.nexcess.net
 * rpmfusion-free-updates: mirror.nexcess.net
 * rpmfusion-nonfree: mirror.nexcess.net
 * rpmfusion-nonfree-updates: mirror.nexcess.net
 * updates: mirror.dmacc.net
Available Packages
cl-asdf.noarch                  20101028-5.fc19                 fedora          
cl-clx.noarch                   0.7.4-4.3                       home_zhonghuaren
cl-ppcre.noarch                 2.0.3-3.3                       home_zhonghuaren

ดังนั้นสิ่งที่เกี่ยวกับวงเล็บ

ฉันสงสัยว่าคุณมีไฟล์ในไดเรกทอรีท้องถิ่นของคุณที่จะได้รับการจับคู่เมื่อคุณใช้เป็นอาร์กิวเมนต์ไปยัง[cl-*] yum searchไฟล์เหล่านี้หลังจากที่ถูกจับคู่โดยเชลล์จะถูกส่งผ่านไปยังyum searchคำสั่งที่ตรงกับที่พบแล้ว

ตัวอย่างเช่น:
$ ls cl-file
cl-file

$ yum search cl-*
Loaded plugins: fastestmirror, langpacks, refresh-packagekit, tsflags
Loading mirror speeds from cached hostfile
 * fedora: mirror.dmacc.net
 * rpmfusion-free: mirror.nexcess.net
 * rpmfusion-free-updates: mirror.nexcess.net
 * rpmfusion-nonfree: mirror.nexcess.net
 * rpmfusion-nonfree-updates: mirror.nexcess.net
 * updates: mirror.dmacc.net
======================================================================= N/S matched: cl-file =======================================================================
opencl-filesystem.noarch : OpenCL filesystem layout

  Name and summary matches only, use "search all" for everything.

หมายเหตุ:การจับคู่ด้านบนถูกจับคู่กับชื่อไฟล์ของฉันcl-fileและไม่ตรงcl-*กับที่ฉันตั้งใจไว้


โอ้ฉันเห็นแล้ว นั่นอธิบายได้ หนึ่งการกล่าวถึง nitpicking cl-*ไม่ใช่การแสดงออกปกติมันเป็นglobหรือสิ่งที่เรียกว่า เป็นภาษาปกติ (ในภาษา Chomskian) แต่เรามักจะพูดว่าบางสิ่งบางอย่างเป็นนิพจน์ปกติถ้ามันกำหนดไวยากรณ์สำหรับภาษาปกติ (โดยใช้การดำเนินงานขั้นพื้นฐานอย่างน้อยสามอย่าง: การต่อข้อมูล, การเปลี่ยนแปลงและดาว Kleene)
wvxvw

@wvxvw - ถูกต้อง คุณเริ่มต้นด้วยคำศัพท์ regex และฉันพึ่งพิงมัน 8-)
slm

3

รุ่น yum ที่แตกต่างกันอย่างแน่นอนโดยใช้ RHEL 6.5 ที่นี่กับ yum 3.2.29 ระวัง:
คุณควรอ้างอิง * เพื่อไม่ให้ตรงกับสิ่งใดในสารบบปัจจุบันผ่าน shell globbing ... สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งนั้นและตัวอย่างที่ใช้งานจริงดูคำตอบในภายหลัง: /unix//a/155157/83329

Anyways เพียงการตรวจสอบอีกครั้งวิธีเดียวที่จะค้นหาจริงได้อย่างมีประสิทธิภาพด้วยการค้นหา yum โดยyum search all | grep fooเป็นyum search fooให้ผลเลือนสวย แต่ใช้yum list "foo-*"งานได้ตามที่คาดหวังและส่งผลให้ในกรณีของคุณอาจเป็นแพคเกจ cl-asdf.noarch

การชำเลืองมองอย่างรวดเร็วเกี่ยวกับ yum bugreports การค้นหา yum ที่ดูเหมือนว่าจะมีข้อเสียอื่น ๆ : https://bugs.launchpad.net/percona-server/+bug/580336/comments/2


1

ขออภัยไม่สามารถแสดงความคิดเห็นจึงต้องใช้คำตอบ

คุณลองyum search cl-*หรือyum list 'cl-*'? อย่างน้อยyum whatprovides */fooมันใช้งานได้กับการค้นหาชื่อไฟล์แม้ว่าจะเป็นกรณีพิเศษ ไม่เช่นนั้นฉันก็มักจะใช้
yum list all | grep -i fooแต่ระวังเอาต์พุตหลายบรรทัดของยำ grep อาจแสดงบรรทัดแรกเท่านั้นดังนั้นอาจใช้yum list all | grep -iA1 foo

นอกจากนี้ยังมีตัวอย่างที่มีประโยชน์ใน man page ด้านล่าง "List Options" นอกจากนี้ยังมีเอกสารเพิ่มเติมที่ต้นน้ำโดยตรงที่http://yum.baseurl.org/เช่นhttp://yum.baseurl.org/wiki/YumCommandsหรือโดยตรงผ่านทาง python: http://yum.baseurl.org/wiki/ YumCodeSnippet / YumSearch


ฉันลองแล้วyum search cl-*หรือยัง - ใช่ฉันทำ. สิ่งนี้ไม่พบ (อาจเป็นรุ่น yum ที่แตกต่างกันฉันยังคงใช้ FC18)
wvxvw

ทีนี้จากการอ่านกรณีการใช้งานที่ตั้งใจสำหรับyum searchการรวมเข้ากับนิพจน์ปกติ / อักขระตัวแทนนั้นซ้ำซ้อน yum searchการค้นหาที่คลุมเครืออยู่แล้วดังนั้นการใช้อักขระตัวแทนจึงไม่มีประโยชน์เลย หากคุณต้องการที่จะ จำกัด การค้นหาของคุณใช้หรือyum list expression yum list all | grep expressionมิฉะนั้นฉันขอแนะนำให้คุณเปิดการร้องขอการปรับปรุงกับ yum - ขอให้โชคดีกับที่: p
doktor5000
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.