ฉันจะเลือกไฟล์เฉพาะในไดเรกทอรีอื่นโดยใช้ bash ได้อย่างไร


13

ฉันต้องการแสดงรายการ (หรือลบหรือดำเนินการอื่น ๆ ) ในบางไฟล์ในไดเรกทอรีเช่นนี้

$ ls /opt/somedir/
aa  bb  cc  aa.txt  bb.txt  cc.txt
$ ls /opt/somedir/(aa|bb|cc)  ## pseudo-bash :p
aa  bb  cc

ฉันจะบรรลุสิ่งนี้ได้อย่างไร (โดยไม่ต้อง cd-ing ไปที่ไดเรกทอรีก่อน)

คำตอบ:


22

ใช้วงเล็บปีกกาสำหรับมัน:

ls /opt/somedir/{aa,bb,cc}

สำหรับข้อมูลเพิ่มเติมอ่านเกี่ยวกับการขยายตัวรั้ง


3

ภายใต้ bash ให้เรียกใช้shopt -s extglob(หรือใส่ไว้ในของคุณ~/.bashrc) และคุณสามารถใช้รูปแบบเพิ่มเติมที่ให้นิพจน์ทั่วไปด้วยไวยากรณ์ที่ผิดปกติ (สืบทอดมาจาก ksh) คุณสามารถใช้รูปแบบเหล่านี้เป็น ksh ได้เช่นกันและใน zsh setopt ksh_globด้วย

$ shopt -s extglob
$ ls /opt/somedir/@(aa|bb|cc|doesnotexist)
/opt/somedir/aa   /opt/somedir/bb  /opt/somedir/cc

ใน zsh คุณสามารถใช้(foo|bar)เป็นรูปแบบโดยตรง

% ls /opt/somedir/(aa|bb|cc|doesnotexist)
/opt/somedir/aa   /opt/somedir/bb  /opt/somedir/cc

โปรดทราบว่าคำสั่งถูกเรียกพร้อมกับพา ธ เต็ม หากคุณต้องการเรียกคำสั่งด้วยพา ธ สั้น ๆ คุณจะต้องเปลี่ยนไดเรกทอรีอย่างใดอย่างหนึ่งและ(cd /opt/somedir && somecommand aa bb cc)เป็นวิธีที่ง่ายที่สุด


ถ้าคุณมองอย่างใกล้ชิดคุณจะเห็นว่าฉันระบุ "โดยซีดีไอเอ็นจีไปยังไดเรกทอรีครั้งแรก" ในคำถามของฉัน;)
neu242

1

คุณสามารถกรองโดยใช้egrep:

ls | egrep '(aa|bb|cc)'

วิธีค้นหาไฟล์ข้อความทั้งหมด:

ls | egrep '(aa|bb|cc).txt'

1
dot จะจับคู่กับตัวละครทุกตัวและวิธีการนี้ทำให้ยากต่อการใช้งานกับไฟล์เหล่านี้เพิ่มเติม
enzotib

1
ฉันรู้สึกว่า ls เป็นเพียงคำสั่งตัวอย่างเช่นกัน
Random832

ใช่คุณพูดถูกฉันระบุว่าฉันต้องการที่จะทำการดำเนินการ: รายชื่อไฟล์เป็นเพียงตัวอย่าง
neu242

ความคิดเห็นดีเพื่อน ๆ ที่รักขอบคุณ ขอให้โชคดี neu242: D
Ocean

1

ครั้งแรกผมนำคุณไปยัง: ไม่เคยสั่ง ls แจง , เคย วิธีการที่เหมาะสมและเป็นที่ยอมรับที่จะทำสิ่งที่คุณต้องการอยู่กับการค้นหา

ตัวอย่างเช่น:

find /opt/somedir -regex '.*[aa|bb|cc].*' -exec mv '{}' ~/backup \;

ฉันมักจะใช้-nameแทน-regexมันง่ายกว่า แต่ regex เหมาะกับกรณีการใช้งานของคุณ คุณควรรันคำสั่งโดยไม่ -execใช้ครั้งแรกเพื่อให้แน่ใจว่าเป็นไฟล์ที่คุณต้องการย้าย / ลบ


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