การเรียกใช้คำสั่ง mercurial สำหรับไดเรกทอรีทั้งหมดในไดเรกทอรีที่กำหนด


1

สมมติว่าฉันมีโคลนที่เก็บประมาณ 10 hg ในไดเรกทอรีหลัก (เรียกว่า "parent") มีวิธีใดบ้างที่ฉันจะเรียกใช้คำสั่ง Mercurial ได้ hg status ในไดเรกทอรีย่อยทั้งหมดแทนที่จะทำหน้าที่ลำบากของ cd ไอเอ็นจีลงในแต่ละไดเรกทอรีแล้วเรียกใช้ hg status?

ฉันลองของเก่าที่ดี xargs แต่ด้วยเหตุผลบางอย่างมันล้มเหลวในการทำงาน คำสั่งที่ฉันใช้คือ:

find . -maxdepth 1 -type d -print | xargs -t "hg status"

และ

ls | xargs -t "hg status"

ปรับปรุง: ทางออกคือการใช้ผู้ถือครองที่ชัดเจนเมื่อใช้ xargs. สิ่งที่ต้องการ:

ls | xargs -t -I {} hg status {}

ลบคำพูด
Mikel

@Mikel: ยังไม่ทำงานไม่ใช่ว่าฉันไม่ได้ลอง ... :)
sasuke

คำตอบ:


2
for dir in ./*/
do
  (cd $dir && hg status)
done

จะเป็นไปไม่ได้หากใช้สายเดียว xargs รวมกัน? ถ้าไม่ฉันจะขอบคุณถ้าคุณสามารถอธิบายได้ว่าทำไมสายการบินเดียวของฉันจึงไม่ทำงาน ขอบคุณ
sasuke

2
รุ่น xargs ใช้งานไม่ได้เพราะมันจบลงด้วยการให้ไดเรกทอรีเป็นอาร์กิวเมนต์หลายตัวสำหรับหนึ่งตัว hg คำสั่ง; คำตอบนี้มีหลายประเด็น hg คำสั่งในไดเรกทอรีที่แตกต่างกัน (โอ้และใช้เครื่องหมายอัฒภาคแทนการขึ้นบรรทัดใหม่และที่ คือ หนึ่งซับ!)
Norman Gray

@Norman: ขอบคุณสำหรับการชี้แจง แต่คำถามก็คือทำไม ls | xargs grep "something" ทำงานได้ แต่ ls | xargs hg status ไม่?
sasuke

1
@sasuke: grep ยอมรับหลายไฟล์เป็นอาร์กิวเมนต์ในขณะที่ hg status ไม่.
Patches

แต่แล้วเกี่ยวกับ ls | xargs -t -I {} mv {} {}.old? อย่างไรก็ตามฉันได้พบวิธีแก้ปัญหาแล้วและต้องใช้ตัวยึดตำแหน่งอย่างชัดเจน xargs. ขอบคุณที่ชี้นำฉันในทางที่ถูกต้องฉันจะยอมรับคำตอบของคุณเพราะมันทำในสิ่งที่ฉันเป็น :)
sasuke

1

ถ้า hg อนุญาตให้ทำงานแบบขนานคุณสามารถใช้ GNU Parallel ได้

parallel cd {} '&&' hg status ::: ./*/

ถ้าไม่ใช่คุณสามารถเพิ่ม -j1:

parallel -j1 cd {} '&&' hg status ::: ./*/

ดูวิดีโอแนะนำเพื่อเรียนรู้เพิ่มเติม: http://www.youtube.com/watch?v=OpaiGYxkSuQ

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