มีวิธีใดบ้างในการซิงค์โครงสร้างไดเรกทอรีเมื่อไฟล์ทั้งสองมีอยู่แล้ว?


1

ฉันมีสองไดรฟ์ที่มีไฟล์เดียวกัน แต่โครงสร้างไดเร็กตอรี่นั้นแตกต่างกันโดยสิ้นเชิง

มีวิธีใดที่จะ 'ย้าย' ไฟล์ทั้งหมดในฝั่งปลายทางเพื่อให้ตรงกับโครงสร้างของด้านที่มา? ด้วยสคริปต์อาจ?

ตัวอย่างเช่นไดรฟ์ A มี:
/foo/bar/123.txt
/foo/bar/234.txt
/foo/bar/dir/567.txt

ในขณะที่ไดรฟ์ B มี:
/some/other/path/123.txt
/bar/doo2/wow/234.txt
/bar/doo/567.txt

ไฟล์ที่สงสัยมีขนาดใหญ่มาก (800GB) ดังนั้นฉันไม่ต้องการคัดลอกใหม่ ฉันต้องการซิงค์โครงสร้างโดยสร้างไดเรกทอรีที่จำเป็นและย้ายไฟล์

ฉันคิดว่าสคริปต์แบบเรียกซ้ำที่จะค้นหาไฟล์ต้นฉบับแต่ละไฟล์บนปลายทางจากนั้นย้ายไปยังไดเรกทอรีที่ตรงกันและสร้างมันหากจำเป็น แต่นั่นมันเกินความสามารถของฉัน ...

ความช่วยเหลือใด ๆ ที่ชื่นชมอย่างมาก!

ขอบคุณ


นี่เป็นสคริปต์ครั้งเดียวหรือจะเป็นสิ่งที่คุณต้องทำอย่างต่อเนื่อง / เป็นประจำ?
Roy Rico เมื่อ

ชื่อไฟล์มีความพิเศษหรือไม่? นั่นคือคุณสามารถรับประกันได้หรือไม่ว่ามีไฟล์เดียวชื่อ "123.txt" คำตอบสำหรับคำถามนี้คือความแตกต่าง "ที่ง่ายและรวดเร็ว" และ "ช้าและค่อนข้างซับซ้อน"
larsks

หากโครงสร้างไฟล์และโฟลเดอร์เหมือนกันในบางระดับคุณควรจะสามารถใช้งานryncได้
martineau

@Roy - ฉันต้องการสิ่งนี้เป็นครั้งคราว
Dan

@ larsks - ใช่ชื่อไฟล์นั้นไม่เหมือนใครทั้งหมด
Dan

คำตอบ:


3

เนื่องจากชื่อไฟล์ของคุณไม่ซ้ำกันสิ่งนี้จะใช้ได้แม้ว่าจะช้า:

#!/bin/sh

src=$1
tgt=$2

# Iterate over all the filenames in the source directory.
(cd $src && find . -type f -print) | while read src_path; do
    src_dir=$(dirname "$src_path")
    src_base=$(basename "$src_path")

    # find the file on the target with the same name.
    tgt_path=$(find $tgt -name "$src_base")

    # skip to next file if there's no matching filename
    # in the target directory.
    [ "$tgt_path" ] || continue

    # create the destination directory and move the file.
    mkdir -p "$tgt/$src_dir"
    mv "$tgt_path" "$tgt/$src_dir"
done

โปรดทราบว่า (a) การตรวจสอบข้อผิดพลาดมีไม่มากเกิดขึ้นที่นี่ (b) จะใช้เวลาสักครู่หากคุณมีไฟล์จำนวนมากและ (c) ตามที่เขียนไว้อาจจะทำให้ไดเรกทอรีว่างเปล่าจำนวนมากอยู่ในเป้าหมาย

นี่คือการทดสอบที่ จำกัด ของฉัน ด้วยไดเรกทอรีต้นทางที่มีลักษณะดังนี้:

$ find src -type f
src/b/file2.txt
src/a/file1.txt
src/c/file3.txt

และไดเรกทอรีเป้าหมายที่มีลักษณะดังนี้:

$ find tgt -type f
tgt/file1.txt
tgt/file2.txt
tgt/not/the/right/place/file3.txt

หากฉันมีสคริปต์ข้างต้นในไฟล์ที่เรียกreorg.shใช้และเรียกใช้ดังนี้:

$ sh reorg.sh src tgt

ฉันจบด้วยไดเรกทอรีเป้าหมายที่มีลักษณะดังนี้:

$ find tgt -type f
tgt/b/file2.txt
tgt/a/file1.txt
tgt/c/file3.txt

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