如何将子目录(和文件)移动并覆盖到父目录?

如何将子目录(和文件)移动并覆盖到父目录?

我的子目录中有大量文件和目录,我想移动到父目录。目标目录中已有一些文件和目录需要覆盖。仅存在于目标中的文件应保持不变。我可以强迫mv这样做吗?它 ( mv * ..) 抱怨

mv: cannot move `xyz' to `../xyz': Directory not empty

我缺少什么?

答案1

您必须使用cp -r * ..后跟的命令将它们复制到目标,然后删除源rm -rf *

我不认为你可以使用“合并”目录mv

答案2

rsync这里可能是一个更好的选择。就这么简单rsync -a subdir/ ./

我的测试树格式filenamecontents

./file1:root
./file2:root
./dir/file3:dir
./dir/file4:dir
./subdir/dir/file3:subdir
./subdir/file1:subdir

跑步rsync

$ rsync -a -v subdir/ ./
sending incremental file list
./
file1
dir/
dir/file3

给出:

./file1:subdir
./file2:root
./dir/file3:subdir
./dir/file4:dir
./subdir/dir/file3:subdir
./subdir/file1:subdir

然后,为了模拟mv,您可能需要删除源目录:

$ rm -r subdir/

给予:

./file1:subdir
./file2:root
./dir/file3:subdir
./dir/file4:dir

如果这是错误的,您能否提供一个具有所需结果的类似示例(例如,使用本答案顶部附近的我的测试树)?

答案3

rsync可以通过参数复制后删除源--remove-source-files

rsync手册页:

--remove-source-files   sender removes synchronized files (non-dir)

答案4

这是一个将文件从下面移动/path/to/source/root到 下相应路径的脚本/path/to/destination/root

  • 如果源和目标中都存在目录,则会递归地移动和合并内容。
  • 如果文件或目录存在于源中但不存在于目标中,则会将其移动。
  • 目标中已存在的任何文件或目录都会被保留。 (特别是合并的目录留在源中。这不容易修复。)

当心,未经测试的代码。

export dest='/path/to/destination/root'
cd /path/to/source/root
find . -type d \( -exec sh -c '[ -d "$dest/$0" ]' {} \; -o \
                  -exec sh -c 'mv "$0" "$dest/$0"' {} \; -prune \) \
    -o -exec sh -c '
        if ! [ -e "$dest/$0" ]; then
          mv -f "$0" "$dest/$0";
        fi
' {} \;

相关内容