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


2

ฉันคัดลอกโฟลเดอร์ขนาดใหญ่จากเครื่อง Windows ไปยังเครื่อง Linux และเนื่องจากชื่อไฟล์บางไฟล์มีขนาดใหญ่เกินไป (และข้อผิดพลาดอื่น ๆ ที่ฉันข้ามไป) บางไฟล์จึงไม่สามารถคัดลอกได้ ขณะนี้ฉันกำลังเรียกใช้ diff -r ระหว่างสองโฟลเดอร์เพื่อสร้างรายการไฟล์ที่อยู่ในโฟลเดอร์ดั้งเดิม แต่ไม่ใช่การคัดลอก อย่างไรก็ตามจนถึงเพียงสิ่งเดียวที่ดูเหมือนว่าได้รับการยอมรับคือโฟลเดอร์ที่ขาดหายไปนั่นคือดูเหมือนว่าจะข้ามไฟล์ มีวิธีที่ดีกว่าสำหรับฉันในการเปรียบเทียบนี้หรือไม่? โดยเฉพาะอย่างยิ่งฉันกังวลว่า Bash ไม่รู้จักไฟล์เหล่านี้ด้วยชื่อไฟล์ที่ยาวเกินไป


โดยทั่วไประบบไฟล์ Linux ที่ทันสมัยจัดการชื่อไฟล์ที่ยาวกว่าชื่อพา ธ ที่ยาวขึ้นและการซ้อนโฟลเดอร์ที่ลึกกว่า NTFS ของ Windows อาจต้องการตรวจสอบข้อความแสดงข้อผิดพลาดที่ทำให้คุณจดทางถนนนี้ ฉันรู้ว่า diff เปรียบเทียบเนื้อหาของไฟล์ ไม่แน่ใจว่ามันทำงานในโฟลเดอร์ในแบบที่คุณพูดถึงหรือไม่ SE ใช้สำหรับ Q & amp; A คำถามที่ดีกว่าคือ "ฉันจะเปรียบเทียบสองโฟลเดอร์ได้อย่างไรเพื่อให้แน่ใจว่ามีไฟล์ชุดเดียวกัน" หากคุณแก้ไขคำถามของคุณเพื่อสะท้อนสิ่งที่คุณพยายามทำบางคนในนั้นอาจมีตัวอย่างรหัสทุบตีหรือรหัสหลาม
Xalorous

ฉันเพิ่งทดสอบ diff -r ทำ ตรวจจับการเปลี่ยนแปลงไฟล์แม้อยู่ในไดเรกทอรีย่อย คุณอาจต้องการที่จะใช้ -urอย่างไรก็ตาม (ฉันค้นหาผลลัพธ์ที่เข้าใจได้ง่ายกว่ามาก)
jpaugh

คำตอบ:


1

คุณอาจทำสิ่งที่ไม่เหมือนสิ้นเชิง:

(cd some/where; ls -lR) > somewhere.txt
(cd else/where; ls -lR) > elsewhere.txt
diff somewhere.txt elsewhere.txt

ฉันไม่ได้ลองสิ่งนี้มันขึ้นอยู่กับไฟล์ข้อมูลเมตา (วันที่เป็นต้น) กำลังถูกเก็บรักษาไว้ cp -p ... ) และบน ls การเรียงชื่อไฟล์ในลำดับเดียวกัน (ซึ่งควร)


ขออภัยสัญกรณ์บางแห่ง / ที่ทำให้ฉันหาย สิ่งนี้จะเป็นในแง่ของไดเรกทอรี?
J. Min

some และ else และ where เป็นตัวยึดตำแหน่งสำหรับพา ธ สัมพัทธ์กับพาเรนต์โฟลเดอร์สองโฟลเดอร์ที่คุณต้องการเปรียบเทียบ (รวมถึงการเปรียบเทียบไดเรกทอรีย่อย) เช่น. cd /home/jmin/catpics และ cd /home/jmin/copy_of_catpics หรืออะไรก็ตาม
RedGrittyBrick

1

diff --recursive ( -r ) ทำการตรวจจับการเปลี่ยนแปลงไฟล์แม้จะอยู่ในไดเรกทอรีย่อย

คุณอาจต้องการที่จะใช้ diff --unified --recursiveอย่างไรก็ตาม มันสร้าง ปึกแผ่น diff ซึ่งแสดงบรรทัดที่ถูกเปลี่ยนแปลงนำหน้าด้วย (+) สำหรับการเพิ่มและ (-) สำหรับการลบ อย่างสะดวกสบายและยังแสดงบรรทัดโดยรอบ (เช่น บริบท ) เพื่อให้คุณสามารถคิดได้ว่าเกิดอะไรขึ้นที่นั่น


ฉันจะเรียกใช้ตอนนี้ หวังว่ามันจะเสร็จภายในระยะเวลาที่เหมาะสม เพียงเพื่อให้แน่ใจโดยสิ้นเชิงนั่นคือ diff -ur ตรงข้ามกับ diff -r ใช่มั้ย เช่นคุณไม่ได้บอกให้ฉันเรียกใช้บางอย่างเช่น diff -r -ur
J. Min

กลับมาจากการลองอีกครั้งหลังจาก 3 ชั่วโมงฉันเริ่มที่จะได้รับความล่าช้าแบบสุ่มในระบบของฉัน ภายในสี่ชั่วโมงฉันไม่มีทางเลือกนอกจากต้องปิดเครื่อง
J. Min

ใช่ฉันหมายถึง diff -u -r. มันบ้ามาก! คุณอาจต้องใช้เครื่องมือที่เหมาะสำหรับชุดไฟล์ขนาดใหญ่แล้ว rsync น่าจะเป็นทางออกที่ดีที่สุดของคุณ
jpaugh

1

หาก rsync เป็นตัวเลือกที่เหมาะสม --itemize-changes (-ฉันและ --dry-run ตัวเลือกที่จะใช้:

rsync -zaic src_dir/ dest_dir/ --dry-run

-z บีบอัดไฟล์ในระหว่างการถ่ายโอนสำเนาในโหมดเก็บถาวรและ -c ฐานการเปรียบเทียบไฟล์บน checksums มากกว่าวันที่แก้ไขหรือขนาด

- ฉันจะแสดงรายการไฟล์แต่ละไฟล์ที่แตกต่างกันและ - วิ่งแห้งหมายความว่าจะไม่มีการถ่ายโอนข้อมูลเพียงแค่สร้างรายการ


มีการใช้งานหรือไม่ ความรู้ของฉัน rsync จะต้องคัดลอกไฟล์อีกครั้ง
J. Min

1
@ J.Min --dry-run flag ไม่ได้คัดลอกอะไรเลยเพียงแค่แสดงให้คุณเห็นว่าเกิดอะไรขึ้น :)
sippybear

1
diff <(cd /first/path/ && find ./ | sort) <(cd /second/path/ && find ./ | sort)

มันคล้ายกับ คำตอบอื่น ๆ นี้ แต่:

  • ฉันกำลังใช้ find เพื่อสร้างรายการของวัตถุ (ไฟล์ไดเรกทอรี); มันเหมาะกับที่นี่ดีกว่า ls เนื่องจากเอาต์พุตมีเพียงพา ธ
  • sort ทำให้มั่นใจว่าลำดับวัตถุที่สัมพันธ์กันจะถูกรักษาไว้ find รายการพวกเขา
  • <(…) ไวยากรณ์หลีกเลี่ยงไฟล์ชั่วคราวใน bash.
  • find จะถูกดำเนินการเฉพาะในกรณีที่สอดคล้องกัน cd ประสบความสำเร็จขอบคุณ && ผู้ประกอบการ สิ่งนี้จะช่วยคุณไม่ให้ทำงาน find ในไดเรกทอรีปัจจุบันหากมีการพิมพ์ผิดในเส้นทางใด ๆ

หมายเหตุเพิ่มเติม:

  • เส้นทางที่ส่งคืนโดย find จะสัมพันธ์กับไดเรกทอรีเรา cd ไปยัง ตรวจสอบให้แน่ใจ /first/path/ และ /second/path/ สอดคล้องกัน
  • เอาท์พุทที่ว่างเปล่าจาก diff ระบุว่าทั้งสองไดเรกทอรีเหมือนกัน; แต่จำไว้…
  • …คำสั่งทำงานบนเส้นทางเท่านั้นไม่ตรวจสอบว่าเนื้อหาหรือข้อมูลเมตาตรงกันหรือไม่
  • ชื่อวัตถุที่มีอักขระผิดปกติ (เช่นขึ้นบรรทัดใหม่) จะทำให้ตรรกะแตก

คุณสามารถใช้ sdiff -s ตรงข้ามกับ diff เพื่อแสดงเฉพาะความแตกต่างจาก 2 รายการนั่นคือไฟล์ที่อยู่ใน dir หนึ่งและไม่ใช่ในอีกไฟล์
AnythingIsFine
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.