当文件已经在两侧时,有什么方法可以同步目录结构吗?

当文件已经在两侧时,有什么方法可以同步目录结构吗?

我有两个驱动器,其中包含相同的文件,但是目录结构完全不同。

有没有办法“移动”目标端的所有文件,使它们与源端的结构相匹配?也许用脚本?

例如,驱动器 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),所以我不想重新复制它们;我只想通过创建必要的目录和移动文件来同步结构。

我当时想写一个递归脚本,它会在目标上找到每个源文件,然后将其移动到匹配的目录,并在必要时创建它。但这超出了我的能力范围...

非常感谢您的帮助!

谢谢

答案1

鉴于您的文件名是唯一的,这将起作用,尽管速度很慢:

#!/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

相关内容