วิธีการเปิดหลายไฟล์จาก `find` output?


10

ฉันรู้ว่าฉันสามารถเปิดหลายไฟล์ที่พบใน dir ดังนี้:

find -name *.foo -xargs <command> {} \;

วิธีนี้ใช้งานได้ แต่เมื่อพยายามเปิด textfiles แบบกลุ่มใน gedit ในเวลาเดียวกันมันจะเปิดขึ้นมาอย่างต่อเนื่อง (เมื่อปิดไฟล์หนึ่งไฟล์จะเปิดขึ้นอีกอันหนึ่ง)

ฉันต้องการเปิดไฟล์ทั้งหมดในเวลาเดียวกัน ฉันจะบรรลุสิ่งนี้ได้อย่างไร

คำตอบ:


15

หากต้องการดำเนินการกับหลายไฟล์พร้อมกันfindให้ใช้+แทน\;:

find . -name '*.foo' -exec gedit {} +

ด้วย zsh หรือทุบตี≥4ถ้าคุณใส่shopt -s globstarในของคุณ~/.bashrcคุณสามารถใช้**/เพื่อ recurse ลงในไดเรกทอรีย่อย:

gedit **/*.foo

zsh นอกจากนี้ยังมีหลายคนบ่น globfindที่สามารถแทนที่การใช้งานมากที่สุดของ


มีใครแนะนำวิธีเรียกใช้บน Mac OS X ได้ไหม
andilabs

@andi แก้ไขได้ด้วยตัวเอง แต่ถ้ามีคนเสนอสักระยะหนึ่งให้สั้นลงหรือบังคับให้ SublimeText เปิดในแท็บแยกต่างหากแทนที่จะเป็นหน้าต่างมันจะถูกตัดออกมาก
andilabs

@andi นี่เป็นปัญหาของ SublimeText คุณควรถามว่าเป็นเธรดแยกต่างหาก
Gilles 'หยุดความชั่วร้าย'

ต่อไปฉันคิดว่ามันเป็นรูปแบบทุบตีที่แน่นอนเพราะถ้าฉันเรียกใช้open -a SublimeText admin.py forms.pyมันจะเปิดในหน้าต่างเดียวที่มีสองแท็บ
andilabs

2

ใน Mac OS X bash คุณสามารถเรียกใช้สิ่งต่อไปนี้:

for file in $(find . -name "*.py"); do open -a SublimeText $file; done. 

ข้อเสียอย่างหนึ่งคือมันเปิดในหน้าต่างใหม่ของ Sublime แทนที่จะใช้แท็บใหม่


0

ฉันคิดว่าในกรณีนี้คุณสามารถใช้

find ./ -name \*.foo | xargs gedit

1
สิ่งนี้จะไม่ทำงานหากชื่อไฟล์มีอักขระพิเศษ (ช่องว่างหรือ\'") เนื่องจากxargsต้องการให้มีการอ้างถึงอินพุตในวิธีที่findไม่ได้สร้างขึ้น ใช้อย่างใดอย่างหนึ่งหรือใช้ง่ายfind … -print0 | xargs -0 … find … -exec … {} +
Gilles 'หยุดชั่วร้าย'

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