Linux:如何移动大型文件树,在复制期间删除文件(而不是之后)

Linux:如何移动大型文件树,在复制期间删除文件(而不是之后)

我想就地加密磁盘,从清晰到 ecryptfs(不是启动盘,只是包含大量数据文件的磁盘)。

我创建了以下结构:

  /mnt/
   clear/ # the source files
   cipher/ # the ecryptfs ciphertext directory
   mounted.clear/ # the mounted ecryptfs directory

我想做这样的事: mv /mnt/clear/* /mnt/mounted.clear/

问题是由于这是一个跨文件系统的移动,mv 将首先复制然后取消链接每个参数(参见这里)。我没有足够的磁盘可用空间来复制 下的某些子目录/mnt/clear

我希望有一个mv --delete-during参数(或类似参数),但没有(无论如何,在 GNU coreutils 8.3 中没有 :)。任何其他简单的有什么想法吗?我可以编写一个快速脚本来完成此操作,但如果有更简单的解决方案/实用程序可用,我宁愿不这样做。

答案1

此选项rsync

--remove-source-files
这告诉rsync从发送端删除作为传输的一部分并且已在接收端成功复制的文件(即非目录)。

rsync -av --remove-source-files /mnt/clear/ /mnt/mounted.clear

我的测试表明该工具会即时删除文件,而不是在最后删除。

笔记:

  • 后面的斜线 ( /)/mnt/clear很重要。
  • “成功复制”意味着即使出现问题,您也不会丢失任何内容。
  • 您需要在单独的步骤中移除目录。使用find /mnt/clear/ ! -type d以确保没有过时的非目录。

如果您不能使用rsync,请考虑以下选项tar

--remove-files
将文件添加到档案后,从磁盘中删除它们。

cd /mnt/mounted.clear/ &&
( cd /mnt/clear/ && tar -vc --remove-files * ) | tar -x

我的测试表明,第一个方法tar是即时删除文件,而不是在最后删除。不过也存在一些缺陷:

  • 您可能希望第一个工具tar推迟删除文件,直到文件安全地写入目标目录。没办法。该工具无法知道管道剩余部分发生了什么。一旦处理文件,它就会删除它。可能发生的情况是第二个工具tar落后,数据在管道缓冲区中积累,第一个工具tar急切地删除文件。在这种情况下,如果第二个工具tar因某种原因失败,则管道将中断,缓冲的内容(来自一些已删除的文件)将丢失。减少缓冲区(例如使用stdbuf)可能会将损害降到最低,但我不确定您是否可以让解决方案完全安全。

    我故意没有使用。在这个版本中,第一个命令处理并删除某些内容后,cd … && tar … | ( cd … && tar … )第二个命令可能会失败。在原始代码中,两个命令都必须成功,第一个命令才能运行。cdtarcdtar

  • *与以 开头的文件不匹配.


补充说明:

  • rsync在我的测试中,文件从目录列表中消失时会有延迟,即在处理它们后几分钟(有时一分钟)tar。我使用 Btrfs,我怀疑这是它的怪癖。

相关内容