ฉันต้องการเปิดไฟล์ข้อความทั้งหมดที่เป็นผลลัพธ์ของคำสั่ง ls โดยใช้โปรแกรมแก้ไขข้อความ ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันต้องการเปิดไฟล์ข้อความทั้งหมดที่เป็นผลลัพธ์ของคำสั่ง ls โดยใช้โปรแกรมแก้ไขข้อความ ฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
กิลส์เป็นสิ่งที่ถูกต้อง , ls
เป็นตัวอย่างที่ไม่ดีจริงๆเพราะการขยายตัวของชื่อไฟล์ glob สามารถทำได้ง่ายมากในบรรทัดคำสั่งโดยไม่ต้องใช้ls
ที่ทุกคน! หากคุณเรียกว่า "ไฟล์ข้อความ" มีนามสกุลไฟล์เพื่อระบุพวกเขาคุณสามารถทำสิ่งนี้:
editor-command *.txt
เพื่อแสดงให้เห็นถึงเทคนิคให้ใช้ตัวอย่างที่ซับซ้อนมากขึ้นซึ่งไม่สามารถทำได้ด้วยการจับคู่ชื่อไฟล์และเปิดไฟล์ตามเนื้อหาแทนชื่อไฟล์ ให้บอกว่าคุณต้องการเปิดไฟล์ทั้งหมดที่มีสตริง "content-type"
สมมติว่าตัวแก้ไขของคุณจะยอมรับชื่อไฟล์หลายชื่อและเปิดทั้งหมดพร้อมกันในบัฟเฟอร์ที่แยกต่างหากหรือทำงานตามลำดับผ่านพวกเขาคุณสามารถเรียกใช้:
editor-command $(grep -i content-type)
ตอนนี้กลับไปที่คำถามเดิมของคุณให้บอกว่าคุณไม่รู้ว่าพวกเขาเป็นไฟล์ข้อความหรือไม่ตามชื่อของพวกเขา จากนั้นคุณจะต้องใช้โปรแกรมอื่นเพื่อระบุตัวตนจากนั้นเปิดโปรแกรมตามข้อมูลนั้น โปรแกรมfile
จะบอกให้คุณทราบว่าไฟล์ประเภทใดและคุณสามารถ grep รายการนั้นเป็นเพียงไฟล์ข้อความจากนั้นเปิดเฉพาะชื่อไฟล์ที่ตรงกันดังนี้:
editor-command $(file -ni * | grep 'text/plain' | cut -d: -f1)
เอาต์พุตของ chain command command ภายใน$()
โครงสร้างจะถูกใช้เป็นอาร์กิวเมนต์สำหรับตัวแก้ไข บางครั้งฉันทำสิ่งนี้ในสองขั้นตอน สมมติว่าฉันกำลังตรวจสอบไฟล์บางชุดและรับรายการไฟล์ xml ทุกไฟล์ที่มีสตริง "content-type"
find -type f -iname '*xml' | xargs grep -Hi 'content-type' | cut -d: -f1
... และตัดสินใจว่าฉันต้องการเปิดพวกเขา จากนั้นฉันใช้ช็อตคัตประวัติคำสั่งล่าสุดและทำสิ่งนี้:
vim $(!!)
... เพื่อเปิดผลลัพธ์ทั้งหมดของคำสั่งก่อนหน้านี้ในกลุ่มแก้ไขที่ฉันชอบ
หากโปรแกรมแก้ไขของคุณจะยอมรับไฟล์ได้ครั้งละหนึ่งไฟล์เท่านั้นและคุณจำเป็นต้องทำการแก้ไขอย่างต่อเนื่องคุณจะต้องใช้ตัวแปรxargs
หรือfor
ลูปในคำตอบของ jmtdโดยขึ้นอยู่กับว่าคุณกำลังใช้เครื่องมือแก้ไขเทอร์มินัลที่ต้องการ stdio
วิธีเปิดไฟล์ทั้งหมดที่เรียกว่า something .txt
(ie *.txt
) ในไดเรกทอรีปัจจุบัน:
$EDITOR *.txt
ที่$EDITOR
เป็นบรรณาธิการที่ชื่นชอบของคุณเช่นgedit *.txt
, nano *.txt
, vim *.txt
, emacs *.txt
หรืออะไรก็ตาม ใช้*
เพื่อจับคู่ไฟล์ทั้งหมดในไดเรกทอรีปัจจุบัน
โปรดทราบว่าls
คำสั่งไม่เกี่ยวข้อง งานของls
ไม่ใช่การแสดงรายการของไฟล์จริงๆถึงแม้ว่ามันจะเกิดขึ้นเมื่อคุณเรียกใช้มันในไดเรกทอรี ls
มีประโยชน์ที่ไหนในการแสดงคุณสมบัติของไฟล์ (เวลาการปรับเปลี่ยนการอนุญาตขนาดและอื่น ๆ ) ในการทำบางสิ่งบางอย่างกับไฟล์จำนวนหนึ่งที่ตรงกับรูปแบบไวด์การ์ดบางอย่างนั้นglobsของเชลล์ก็เพียงพอแล้ว
เครื่องมือแก้ไขขั้นสูงเพียงพอให้คุณทำสิ่งนี้ได้จากภายใน ยกตัวอย่างเช่นใน Emacs เพียงแค่ใช้คำสั่งเปิดไฟล์ปกติ ( C-x C-f
) *.txt
และป้อน
หากคุณยังต้องการที่จะตรงกับไฟล์ในไดเรกทอรีย่อยใน zsh $EDITOR **/*.txt
หรือทุบตี≥4คุณสามารถใช้
ขึ้นอยู่กับความแตกต่างของตัวแก้ไขข้อความของคุณ เครื่องมือแก้ไขขั้นสูงอาจจัดการเปิดไฟล์หลายไฟล์จากบรรทัดคำสั่งในอินสแตนซ์เดียว แต่พูดเช่นว่าบรรณาธิการของคุณ ($ EDITOR ในตัวอย่างของฉันด้านล่าง) สามารถเปิดทีละครั้งเท่านั้น คุณควรท่อส่งออกของที่เหมาะสมลงในfind
xargs
สิ่งนี้ยังขึ้นอยู่กับ $ EDITOR ที่ไม่ได้ครอบครอง TTY (เช่นใช้กราฟิก)
find . -maxdepth 1 -type f -name '*.c' -print0 | xargs -r0n 1 $EDITOR
หากคุณต้องการใช้ตัวแก้ไขคอนโซลวงเปลือกอาจเหมาะสมกว่า แต่ถ้าจะล้มเหลวสำหรับชื่อไฟล์ที่ผิดปกติจำนวนมาก (โดยการยุบหรือแทนที่อักขระช่องว่างและสิ่งอื่น ๆ ):
for i in *.c; do $EDITOR "$i"; done
for
กรณีนี้จะล้มเหลวสำหรับชื่อไฟล์จำนวนมากรวมถึงการยุบ / เปลี่ยนอักขระช่องว่าง
for
เคสจะทำงานกับทุกชื่อไฟล์ (ยกเว้นชื่อที่อาจขึ้นต้นด้วย-
หรือ+
มีบรรณาธิการบางคนfor i in ./*.c
จะแก้ไขได้)
editor-command *.css
ฯลฯ