我有两个驱动器,其中包含相同的文件,但是目录结构完全不同。
有没有办法“移动”目标端的所有文件,使它们与源端的结构相匹配?也许用脚本?
例如,驱动器 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