การใช้ * ในการค้นหาไฟล์


9

ในขณะที่อ่านเกี่ยวกับการค้นหาไฟล์ linux ฉันได้ดังต่อไปนี้ ...

ในการค้นหาไฟล์โดยใช้ * wildcard ให้แทนที่สตริงที่ไม่รู้จักด้วย * เช่นหากคุณจำได้ว่าเฉพาะนามสกุลที่เป็น. out ให้พิมพ์ ls * .out

และเมื่อฉันลองคำสั่งต่อไปนี้ในระบบ (Ubuntu 14.04 LTS) .. ฉันได้รับ

anupam@JAZZ:~$ ls  *.bash* 

ls: cannot access  *.bash* : No such file or directory

anupam@JAZZ:~$ ls  .bash*

.bash_history   .bash_logout  .bash_profile  .bashrc

anupam@JAZZ:~$

ในกรณีแรกที่มันแสดงไม่มีไดเรกทอรีดังกล่าว ( *.bash*) และในกรณีถัดไปมันแสดงไฟล์ ( .bash*)

ฉันยังใหม่กับรสชาตินี้และตามคลาสออโตทฤษฎี (*) ของฉันหมายถึงการรวมกันของสตริงใด ๆ รวมทั้ง epsilon (ว่าง) ,, ดังนั้นทำไมผลลัพธ์ที่แตกต่างกันในทั้งสองกรณี .... ?

คำตอบ:


11

เมื่อคุณทำจะถูกขยายก่อนที่มันจะถูกส่งผ่านไปยัง นั่นคือจะบอกว่าถ้าเรามีสามไฟล์ ( , และ) ในไดเรกทอรีกำลังทำงานจริงls **lsabcls *ls a b c

เมื่อ Bash ไม่สามารถขยายได้มันจะส่งผ่านสตริงดิบ¹ นั่นเป็นสาเหตุที่คุณเห็นอักขระตัวแทนในข้อผิดพลาดพร้อมกับข้อความที่ไม่พบ พยายามที่จะแสดงรายชื่อของไฟล์ที่เรียกว่าอักษรls*.bash*

ดังนั้นทำไมไม่ได้ที่ขยาย? โดยค่าเริ่มต้นการวนรอบ (สิ่งที่เรียกว่าการขยายสัญลักษณ์นี้) จะไม่ส่งคืนไฟล์ที่ซ่อน คุณสามารถเปลี่ยนแปลงสิ่งนี้ได้ด้วยshopt -s dotglob(ซึ่งจะไม่คงอยู่จนกว่าคุณจะติดมัน.bashrc- มันอาจถูกปิดใช้งานโดยค่าเริ่มต้นด้วยเหตุผลที่ดีดังนั้นควรระมัดระวังด้วย) นี่เป็นตัวอย่างด่วน:

$ ls  *.bash*
ls: cannot access *.bash*: No such file or directory
$ shopt -s dotglob
$ ls  *.bash*
.bash_aliases  .bash_history  .bash_logout  .bashrc  .bashrc.save

ข้อยกเว้นสำหรับเรื่องนี้คือ - เมื่อคุณแสดงไปแล้ว - เมื่อคุณระบุไว้อย่างชัดเจนแล้วไฟล์จะถูกซ่อนด้วยรูปแบบ.bash*ดังนี้ เพียงแทนที่การdotglobตั้งค่าเริ่มต้น:

$ shopt -u dotglob  # unset dotglob
$ ls .bash*
.bash_aliases  .bash_history  .bash_logout  .bashrc  .bashrc.save

อย่างไรก็ตามนอกเหนือจากการเล่นโวหารที่ฉันหวังว่านี้จะช่วยให้คุณเข้าใจสิ่งที่เกิดขึ้นภายใต้พื้นผิว


มีอื่น ๆ ที่มีshoptธงที่เปลี่ยนแปลงวิธีการทำงาน globbing: extglob, failglob, globstar, และnocaseglob nullglobพวกเขาและแพอื่น ๆshoptธงจะถูกบันทึกเป็นส่วนหนึ่งของคู่มือการทุบตี

หน้าในการจับคู่รูปแบบควรทำเพื่อการอ่านที่ดี

¹เว้นแต่failglobหรือnullglobเป็นชุด


thanx @Oli ,, ฉันไม่ได้รับทุกอย่างที่ฉันกล่าวถึงฉันใหม่กับรสชาตินี้ แต่ฉันได้รับ 80% ของที่ ... มันช่วยให้ฉัน
lazarus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.