วิธีกระจายชื่อไฟล์ในสองไดเรกทอรี (โดยไม่ต้องเขียนไปยังไฟล์ระดับกลาง)


31

ฉันกำลังพยายามทำบางสิ่งตามแนวของ:

diff `ls -1a ./dir1` `ls -1a ./dir2`

แต่นั่นไม่ได้สำหรับเหตุผลที่ชัดเจน มีวิธีที่ดีกว่าในการบรรลุเป้าหมายนี้ (ใน 1 บรรทัด) มากกว่านี้หรือไม่?

ls -1a ./dir1 > lsdir1
ls -1a ./dir2 > lsdir2
diff lsdir1 lsdir2

ขอบคุณ

คำตอบ:


47

คุณสนิท ใน bash คุณต้องการทดแทนกระบวนการไม่ใช่การทดแทนคำสั่ง:

diff <(ls -1a ./dir1) <(ls -1a ./dir2)

แม้ว่าจะไม่จำเป็นต้องทดแทนกระบวนการ คำตอบด้านล่าง ( superuser.com/a/228773/566289 ) นั้นตรงประเด็น!
Jan D

ยกเว้นคำตอบนั้นจะแตกต่างเนื้อหาไม่ใช่ชื่อไฟล์!
แพ้

10
diff -rq dir1 dir2

ใช้ตัวเลือก -r เดินแผนผังไดเรกทอรีทั้งหมดตรวจสอบความแตกต่างระหว่างไดเรกทอรีย่อยและไฟล์ซ้ำที่เกิดขึ้นที่จุดเทียบเคียงในแต่ละแผนผัง เคล็ดลับคือการใช้ตัวเลือก -q เพื่อระงับการเปรียบเทียบทีละบรรทัด


3
@festo: คุณหายไป poitn ของคำถามนี้ฉันไม่ต้องการ diff เนื้อหาของไฟล์ฉันต้องการ diff ผลลัพธ์ของlsคำสั่ง
bguiz

+1, จริง ๆ แล้ว, ฉันได้ผลลัพธ์เดียวกันกับหนึ่ง caveat, diff -rq รายงานไฟล์ที่เชื่อมโยงว่า 'ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว' ดังนั้นบวกหนึ่งสำหรับการใช้งานที่ถูกต้องและเรียบง่ายขึ้น (แม้ว่าคำตอบของ IVA จะเป็น 'โอกาสการเรียนรู้' ที่ดีกว่าสำหรับการทดแทนกระบวนการ (> _ <)
xtian

1
นี้เป็นมากช้ากว่า diffing ชื่อไฟล์: ความสมบูรณ์ของไฟล์ทุกไฟล์จะต้องมีการอ่านและเมื่อเทียบกับ
Zaz

@Josh แน่นอนเพราะมันเกิดขึ้นซ้ำ ๆ ....
Braiam

1
@Braiam: แม้ว่าคุณซ้ำ diff ชื่อไฟล์ (ใช้rsyncกับ--dry-runตัวเลือกเช่น) diff -rก็ยังจะเร็วกว่า
Zaz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.