我想就地加密磁盘,从清晰到 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 … )
第二个命令可能会失败。在原始代码中,两个命令都必须成功,第一个命令才能运行。cd
tar
cd
tar
*
与以 开头的文件不匹配.
。
补充说明:
rsync
在我的测试中,文件从目录列表中消失时会有延迟,即在处理它们后几分钟(有时一分钟)tar
。我使用 Btrfs,我怀疑这是它的怪癖。