ค้นหาไฟล์ในไดเรกทอรีเดียวไม่ได้อยู่ในไดเรกทอรีอื่น


12

มีเครื่องมือ Linux / Unix ใดบ้างที่ค้นหาไฟล์ทั้งหมดในไดเรกทอรีเดียวที่ไม่มีอยู่ในอีกไดเรกทอรีหนึ่ง? โดยทั่วไปฉันกำลังมองหา diff ซึ่งทำงานกับผลลัพธ์ของ ls

สคริปต์สั้นและหวานก็ชื่นชม

คำตอบ:


20

diff ทำสิ่งนี้แล้ว:

diff dir1 dir2

ตัวอย่างผลลัพธ์:

Only in dir1: some_file.txt
Only in dir1: some_other_file.txt
Only in dir2: third_file.txt

5
ดีจัง. One gripe: diff กำลังทำงานในแต่ละไฟล์ที่อยู่ในทั้งสอง มีตัวเลือกที่คลุมเครือที่จะเรียกใช้กับชื่อไฟล์ (ฉันอาจพลาด)? มิฉะนั้นฉันขอแนะนำdiff dir1 dir2 | grep "Only"
Willi Ballenthin

ว้าวแค่นี้ช่วยฉันประหยัดเวลาหลายนาทีในการขอขอบคุณสคริปต์ bash
user5359531

10

ทุบตี:

diff <(cd dir1; ls) <(cd dir2; ls)

เปรียบเทียบเฉพาะชื่อไฟล์ - ไม่ใช่เนื้อหาของไฟล์



ใช้ rsync สำหรับการซิงค์ dirs
c4f4t0r

อย่าแยกวิเคราะห์lsใช้findแทน!
val พูดว่า Reinstate Monica

4

เช่นเดียวกับที่คนอื่นบอกคุณที่นี่คุณสามารถใช้ DIFF ในรูปแบบการใช้งานที่หลากหลาย หรือคุณเพียงแค่ใช้dirdiffแทนซึ่งมีความหมายสำหรับสิ่งที่คุณพยายาม! :-)

แต่ถ้าคุณต้องการให้บางไดเรกทอรีอยู่ในการซิงค์คุณควรจะดูrsyncจริงๆ

ความนับถือ


3

หากคุณต้องการทำเช่นนี้ผ่านไดเรกทอรีย่อยทั้งหมดเช่นกันวิธีที่ดีที่จะทำคือ:

diff --brief -r dir1/ dir2/

ฉันชอบที่จะใช้บทสรุป แต่คุณสามารถปล่อยให้มันออกไปถ้าคุณต้องการ





0

เดนนิสวิลเลียมสันมีคำตอบที่ดีแต่ฉันต้องทำแบบนี้ซ้ำ ๆ GNU findutils 4.7.0 ไม่ได้เรียงลำดับผลลัพธ์ดังนั้นนี่คือสิ่งที่ฉันใช้

diff <(cd $dir1; find | sort) <(cd $dir2; find | sort)

เมื่อต้องการทำสิ่งนี้เพียงวิธีเดียวและสร้างรายการไฟล์ฉันใช้สิ่งนี้:

diff <(cd $dir1; find | sort) <(cd $dir2; find | sort) \
| grep '< ./' | sed "s,< ./,$dir1/,"

เพื่อให้ทำงานได้อย่างถูกต้องทั้ง $ dir1 และ $ dir2 ไม่ควรรวมเครื่องหมายสแลช

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