มีเครื่องมือ Linux / Unix ใดบ้างที่ค้นหาไฟล์ทั้งหมดในไดเรกทอรีเดียวที่ไม่มีอยู่ในอีกไดเรกทอรีหนึ่ง? โดยทั่วไปฉันกำลังมองหา diff ซึ่งทำงานกับผลลัพธ์ของ ls
สคริปต์สั้นและหวานก็ชื่นชม
มีเครื่องมือ Linux / Unix ใดบ้างที่ค้นหาไฟล์ทั้งหมดในไดเรกทอรีเดียวที่ไม่มีอยู่ในอีกไดเรกทอรีหนึ่ง? โดยทั่วไปฉันกำลังมองหา diff ซึ่งทำงานกับผลลัพธ์ของ ls
สคริปต์สั้นและหวานก็ชื่นชม
คำตอบ:
diff
ทำสิ่งนี้แล้ว:
diff dir1 dir2
ตัวอย่างผลลัพธ์:
Only in dir1: some_file.txt
Only in dir1: some_other_file.txt
Only in dir2: third_file.txt
ทุบตี:
diff <(cd dir1; ls) <(cd dir2; ls)
เปรียบเทียบเฉพาะชื่อไฟล์ - ไม่ใช่เนื้อหาของไฟล์
ls
ใช้find
แทน!
เช่นเดียวกับที่คนอื่นบอกคุณที่นี่คุณสามารถใช้ DIFF ในรูปแบบการใช้งานที่หลากหลาย หรือคุณเพียงแค่ใช้dirdiff
แทนซึ่งมีความหมายสำหรับสิ่งที่คุณพยายาม! :-)
แต่ถ้าคุณต้องการให้บางไดเรกทอรีอยู่ในการซิงค์คุณควรจะดูrsync
จริงๆ
ความนับถือ
หากคุณต้องการทำเช่นนี้ผ่านไดเรกทอรีย่อยทั้งหมดเช่นกันวิธีที่ดีที่จะทำคือ:
diff --brief -r dir1/ dir2/
ฉันชอบที่จะใช้บทสรุป แต่คุณสามารถปล่อยให้มันออกไปถ้าคุณต้องการ
for i in $(ls -1 directory1); do if (test -f directory2/$i) then echo $i; fi; done
งานนี้ ..
ls -a1 /dir1 | sort > /tmp/1
ls -a1 /dir2 | sort > /tmp/2
diff /tmp/1 /tmp/2
ยังไม่ทดลอง:
find /dir/A -printf "%P" | while read f; do
if [ ! -e "/dir/B/$f" ]; then
echo $f
fi
done
เดนนิสวิลเลียมสันมีคำตอบที่ดีแต่ฉันต้องทำแบบนี้ซ้ำ ๆ 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 ไม่ควรรวมเครื่องหมายสแลช
diff dir1 dir2 | grep "Only"