ฉันจะเปิดไฟล์ทั้งหมดที่เป็นผลลัพธ์ของคำสั่ง ls ได้อย่างไร


10

ฉันต้องการเปิดไฟล์ข้อความทั้งหมดที่เป็นผลลัพธ์ของคำสั่ง ls โดยใช้โปรแกรมแก้ไขข้อความ ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


12

กิลส์เป็นสิ่งที่ถูกต้อง , 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



@Gilles: ตั้งข้อสังเกตไว้อย่างถูกต้องขอบคุณสำหรับการชี้ให้เห็นอย่างชัดเจนว่าเราทุกคนมองไม่เห็น @ c0smikdebris โปรดทราบว่าฉันเพิ่งเขียนคำตอบใหม่ทั้งหมดรวมถึงกรณีสำหรับหากคุณไม่มีวิธีการจับคู่ที่ชัดเจนว่าไฟล์ใดเป็นข้อความด้วยชื่อของพวกเขา
Caleb

$ () คือสิ่งที่ฉันกำลังมองหา ฉันควรจะกล่าวว่าฉันใช้ ls เป็นตัวอย่างที่นี่ +1 ทั้งคำตอบ
c0smikdebris

"บรรณาธิการที่ฉันโปรดปราน" ไม่จำเป็นต้องระบุ @Caleb เนื่องจากชัดเจนมากขึ้นหรือน้อยลงจากจุดเริ่มต้นของคำตอบ ahahah! บรรณาธิการที่ดีที่สุด!
Enrico Maria De Angelis

4

วิธีเปิดไฟล์ทั้งหมดที่เรียกว่า 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คุณสามารถใช้


นั่นเป็นตัวแก้ไขเฉพาะจริงๆ ไม่มีการรับประกันว่าบรรณาธิการทุกคนจะปฏิบัติต่ออาร์กิวเมนต์บรรทัดคำสั่งฟรีทั้งหมดของพวกเขาเป็นไฟล์ที่จะเปิดหรือสนับสนุนการเปิดมากกว่าหนึ่งไฟล์ในแต่ละครั้ง
jmtd

2

ขึ้นอยู่กับความแตกต่างของตัวแก้ไขข้อความของคุณ เครื่องมือแก้ไขขั้นสูงอาจจัดการเปิดไฟล์หลายไฟล์จากบรรทัดคำสั่งในอินสแตนซ์เดียว แต่พูดเช่นว่าบรรณาธิการของคุณ ($ 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


จับดี - แก้ไขอย่างเหมาะสม
jmtd

โปรดทราบว่าforกรณีนี้จะล้มเหลวสำหรับชื่อไฟล์จำนวนมากรวมถึงการยุบ / เปลี่ยนอักขระช่องว่าง
jmtd

ตามที่เขียนไว้ตอนนี้forเคสจะทำงานกับทุกชื่อไฟล์ (ยกเว้นชื่อที่อาจขึ้นต้นด้วย-หรือ+มีบรรณาธิการบางคนfor i in ./*.cจะแก้ไขได้)
Gilles 'ดังนั้น - หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.