รายการไฟล์ที่ตรงกับรูปแบบ แต่ไม่สนใจไฟล์ที่ตรงกับรูปแบบอื่น?


12

สมมติว่าฉันมีไดเรกทอรีที่มีไฟล์ a1, a2, a3, b1, b2, b3 ฉันเพียงต้องการให้ตรงกับไฟล์ที่เริ่มต้นด้วยแต่ไม่ได้มีa 3ฉันพยายามls -I "*3" *a*แต่มันกลับแม้ว่าฉันไม่ต้องการให้ตรงกับa1 a2 a3 a3เป็นไปได้ด้วยlsหรือไม่


ชุดคำตอบที่น่าสนใจหลากหลายที่นี่ แต่คำอธิบายว่าทำไม ls -I '* 3' a * ล้มเหลวจะแก้ไขได้ และ / หรือทำไมรายการที่อยู่ในกรอบกลมของเชลล์ไม่ถูกกรองในภายหลังโดยสวิตช์สลับเป็น ls?
Theophrastus

หน้าคนพูดเกี่ยวกับตัวเลือก -I: do not list implied entries matching shell PATTERNแต่มันไม่ได้อธิบายสิ่งที่มีความหมายโดยนัยแต่ฉันเดาว่ามันใช้ได้กับไฟล์ที่lsได้รับจากการขยายแบบกลม - และlsไม่ขยายตัวa*เชลล์ทำอย่างนั้น .
Murray Jensen

คำตอบ:


14

แค่:

shopt -s extglob  
ls a!(*3*)
  • shopt -s extglob เปิดใช้งานการขยายแบบวงกลม
  • a ตรงกับการเริ่มต้น a
  • !()คัดค้านการแข่งขันภายใน()...
    • *3*ซึ่งเป็น3และอะไรก่อนหรือหลังมัน

$ touch 1 2 3 a1 a2 a3 b1 b2 b3 aa1 aa2 aa3 a2a a3a
$ ls a!(*3*)
a1  a2  a2a  aa1  aa2

1
FYI ต้องการset -s extglob
Brian

@Brian Yea เพิ่งสังเกตุ ^^
โกลาหล

8

คำตอบที่มีอยู่ให้ระบุวิธีที่ดีที่สุดในการทำสิ่งนี้ด้วย globs; ฉันจะรวมสิ่งนี้เพราะในกรณีส่วนใหญ่findเป็นตัวเลือกที่ดีกว่าถ้าคุณต้องการทำการเขียนสคริปต์หรือประมวลผลเพิ่มเติม:

$ find . -maxdepth 1 -name 'a*' -not -name '*3*'
./a1
./a2

คุณสามารถป้อนคำตอบxargsสำหรับการกระทำที่ง่ายหรือwhile readวนซ้ำสำหรับสิ่งที่ซับซ้อนมากขึ้น


4

วิธีง่ายๆคือ

  • เพื่อแสดงรายการไฟล์ทั้งหมดที่ตรงกัน a*
  • จากนั้นลบบรรทัดทั้งหมดที่มี a 3

คำสั่ง UNIX คือ

ls -1 a* | grep -v 3

ls -1 แสดงหนึ่งไฟล์ต่อบรรทัด

grepโดยปกติแล้วจะพบบรรทัดที่ตรงกับรูปแบบ แต่เมื่อมี-vพฤติกรรมนี้จะกลับด้านเช่น grep ค้นหาบรรทัดที่ไม่ตรงกับรูปแบบนั้น


2
สวัสดีปีเตอร์! มันจะเป็นการดีที่สุดที่จะอธิบายรายละเอียดให้มากที่สุดเท่าที่มีความเกี่ยวข้องกับวิธีการแก้ปัญหาของคุณ
dhag

2
การแยกlsไม่ได้เป็นความคิดที่โง่
โกลาหล

3

ด้วยการzshใช้~ โอเปอเรเตอร์ glob :

setopt extendedglob
print -rl -- a*~*3*

ด้วยgnu lsคุณสามารถใช้สอง--ignoreตัวเลือก:

ls -I '[^a]*' -I '*3*'

ตัวที่ 1 จะไม่สนใจชื่อไฟล์ทั้งหมดที่ไม่ได้ขึ้นต้นด้วยaตัวที่สองจะไม่สนใจชื่อไฟล์ที่มี3

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