在 Linux 上移动文件,将现有目录附加到目标

在 Linux 上移动文件,将现有目录附加到目标

因此我们假设我有:

dest/dir/file1
dest/dir/file2
dest/dir/subdir/subfile1
dest/dir/subdir/subfile2

src/dir/file3
src/dir/subdir/subfile3
src/dir/newdir/anotherfile

...我们假设有数千个文件和子目录。

现在我想将所有新文件从 src 移动到 dest,移动到它们各自的目录,并在需要时创建新的子目录。这相当于“cp -a 源目录/目录 目标目录/“,而是作为移动操作。显而易见的命令”mv 源/目录 目标/“失败,因为目录已存在于目标中。

我怎样才能用一个命令做到这一点?

答案1

您可以使用 rsync。

rsync -av --remove-source-files src/ dest/

不幸的是,这不会删除目录。您可以添加另一个命令来删除它们。

答案2

它不是 cp -a,-a 开关是存档开关。

它应该是 cp -R,递归开关。

您还可以添加 -f 开关来强制覆盖。

答案3

虽然同步对于简单地移动文件来说,选项更好,这是另一种方法;使用寻找反复调用动量

# First, move directories that don't exist on the destination:
(cd src/dir ; find * -type d -print) | while read f; do
   [ ! -d "src/dir/$f" ] || [ -d "dest/dir/$f" ] || mv "src/dir/$f" "dest/dir/$f"
done
# Then move individual files:
(cd src/dir ; find * -type f -print0) | xargs -0 -n1 -i@ /bin/mv src/dir/@ dest/dir/@

# Alternate to the xargs usage, to allow prompting before overwriting files:
(cd src/dir ; find * -type f) | while read f; do
    /bin/mv -i "src/dir/$f" "dest/dir/$f" </dev/tty
done

注意:

  • _寻找 *将跳过以点(“。”)开头的任何文件/目录。
  • 这也不会删除目录。

我每晚都会使用类似这样的方法计划任务在我的个人图片库中创建新图片的缩略图,然后使用同步在第二台机器上备份所有图像。

答案4

据我所知,递归mv是不可能的。我建议先执行一个,cp -R然后再执行一个rm -r

相关内容