![如何将子目录(和文件)移动并覆盖到父目录?](https://linux22.com/image/48327/%E5%A6%82%E4%BD%95%E5%B0%86%E5%AD%90%E7%9B%AE%E5%BD%95%EF%BC%88%E5%92%8C%E6%96%87%E4%BB%B6%EF%BC%89%E7%A7%BB%E5%8A%A8%E5%B9%B6%E8%A6%86%E7%9B%96%E5%88%B0%E7%88%B6%E7%9B%AE%E5%BD%95%EF%BC%9F.png)
我的子目录中有大量文件和目录,我想移动到父目录。目标目录中已有一些文件和目录需要覆盖。仅存在于目标中的文件应保持不变。我可以强迫mv
这样做吗?它 ( mv * ..
) 抱怨
mv: cannot move `xyz' to `../xyz': Directory not empty
我缺少什么?
答案1
您必须使用cp -r * ..
后跟的命令将它们复制到目标,然后删除源rm -rf *
。
我不认为你可以使用“合并”目录mv
。
答案2
rsync
这里可能是一个更好的选择。就这么简单rsync -a subdir/ ./
。
我的测试树格式filename
为contents
:
./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
' {} \;