การใช้รูปแบบ OR ในสัญลักษณ์ตัวแทนเชลล์


52

เนื้อหาของ dir ของฉันคือ

$ ls -lrt
total 0
-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 night.txt
-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 noon.txt
-rw-r--r-- 1 user1 admin 38 Oct  8 12:31 day.txt

ฉันต้องการแสดงรายละเอียดของไฟล์ที่มีคำในชื่อไฟล์ตามที่ระบุ

ตัวอย่าง:

$ ls -lrt *day|night*
ls: *day: No such file or directory
bash: night.txt: command not found

ผลลัพธ์ที่คาดหวัง

-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 night.txt
-rw-r--r-- 1 user1 admin 38 Oct  8 12:31 day.txt

วิธีการแสดงรายการไฟล์ต่าง ๆ ที่ตรงกับ 2 partterns ที่แตกต่างกันหรือโดยย่อในการใช้ regex ด้วยlsเพื่อที่ฉันจะได้ORส่วนชื่อไฟล์

Scenarion ดั้งเดิม, มีไฟล์จำนวนมากในไดเรกทอรี, ทำให้คดีเล็กลงเพื่อถาม

คำตอบ:


65

คุณไม่จำเป็นต้องเปิดการใช้งานแบบขยายเพิ่มเติมเพื่อทำสิ่งที่คุณต้องการ สิ่งนี้จะทำงานใน bash:

ls {day*,night*}

7
ไม่ไม่: touch day.txt; touch night.txt; ls {*day,night*}ผลลัพธ์เป็นls: *day: No such file or directory
Matteo

1
ฉันกำลังปรับข้อความต้นฉบับของโปสเตอร์ ฉันคิดว่าชัดเจน ถอนหายใจ อัปเดตข้อความแล้ว แน่นอนคุณเห็นหรือไม่ว่ากลไกนั้นใช้งานได้?
itsbruce

7
หรืออาจ*{day,night}*ใกล้เคียงกับที่ OP ต้องการ
Derobert

25

ไม่มีตัวเลือกในlsการกรองชื่อไฟล์ แต่ในเชลล์ส่วนใหญ่จะมีส่วนขยายแบบกลมman bash /Pattern Matching

ksh

ls -lrtd -- *@(day|night)*

zsh

setopt extendedglob
ls -lrtd -- *(day|night)*

หรือ:

setopt kshglob
ls -lrtd -- *@(day|night)*

ทุบตี

shopt -s extglob
ls -lrtd -- *@(day|night)*

ในทั้งสามเชลล์คุณสามารถทำสิ่งนี้ได้ แต่โปรดสังเกตว่าหากหนึ่งในเคสไม่ตรงกับไฟล์ใด ๆ รูปแบบนั้นจะไม่ถูกขยายออก (เช่น*day* night1.txt othernight.txtหากไม่มีชื่อไฟล์ที่มีอยู่dayดูman bash /EXPANSIONหรือ/Brace Expansionเฉพาะ):

ls -lrtd -- *{day,night}*

ในกระสุนใด ๆ ที่คุณสามารถทำได้:

ls -lrtd -- *day* *night*

ใน zsh หากไม่มีdayหรือnightไฟล์คำสั่งสองคำสั่งสุดท้ายจะล้มเหลว ตั้งค่าnonomatchหรือcsh_null_globตัวเลือกหรือเพิ่ม(N)หลังแต่ละรูปแบบเพื่อหลีกเลี่ยงปัญหานี้


1
*{day,night}*สิ่งที่เกี่ยวกับ ฉันจะแก้ไข แต่ฉันไม่ทราบว่าหอยใดสนับสนุน
Random832

@ Random832 ทำงานในbash, kshและzsh(ไม่จำเป็นต้องขยาย globbing) แต่ไม่ได้sh- แต่ล่าสุด "เปลือกหอยทุกคน" ตัวอย่างเช่น Nahuel shของการทำงานใน
Izkata

14

เชลล์ไม่ใช้นิพจน์ทั่วไปสำหรับการขยายอาร์กิวเมนต์

คุณสามารถเปิดใช้งานการจับคู่รูปแบบเพิ่มเติมโดย

$ shopt -s extglob

แล้ว

$ ls @(day|night).txt
day.txt   night.txt

ดูตัวอย่างคู่มืออ้างอิง Bash (การจับคู่รูปแบบ)

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