将文件移出卷然后再移回,同时保留所有属性?

将文件移出卷然后再移回,同时保留所有属性?

我遇到过这种情况:我正在测试一个新文件系统,但其中的一些元数据有问题。所有文件都完好无损,但我最终必须有效地将每个文件移至另一个卷,然后立即放回原位。

显然mv不会奏效,因为它无法保留所有属性(特别是所有时间戳)。我在考虑在执行cp -p /original/path/to/file /tmp/location/filerm /original/path/to/filecp -p /tmp/location/file /original/path/to/file、时执行 find 命令rm /tmp/location/file。也许所有这些命令都在传递给 find exec 的脚本中?

我不确定这里最有效的方法是什么,但我希望快速输入一些信息,以确保我涵盖了所有基础,并有一个精确的命令,不会让我在一切都说完之后为某种数据属性的丢失而感到悲伤。我有数百 GB 的数据需要来回移动,所以我需要尽可能小心和高效。

这是我目前想到的解决方案,希望得到一些意见:

Shell 脚本safe_move.sh

#!/usr/bin/env bash
SRC_FILE_AND_PATH="$1"
SRC_BASENAME=`basename "$1"`
DESTINATION_PATH="/mnt/tmp"

cp -a ${SRC_FILE_AND_PATH} ${DESTINATION_PATH}/${SRC_BASENAME}
rm -f ${SRC_FILE_AND_PATH}
cp -a ${DESTINATION_PATH}/${SRC_BASENAME} ${SRC_FILE_AND_PATH}
rm -f ${DESTINATION_PATH}/${SRC_BASENAME}

这将被调用:

find /path/to/move -type f -exec safe_move.sh {} \;

有什么想法或更正吗?

  • 我确实发现了一个问题,由于修改了文件夹的子项,这将改变文件夹日期... 嗯。目前还不确定如何解决这个问题。

答案1

考虑使用tar( -p) --preserve。这样,你还有一个不错的 tarball 可以保存……你知道……以防万一。据我所知,没有元数据会被遗留。如果发现我错了,我也不承担任何责任。=)

编辑:符号链接日期不会被保留!看?!永远不要相信具有 root 权限的猫。

其他选项包括,cplv但您没有至少与源大小相同的卷组。cpdup如果都在同一个卷组上,rsync则可能是一个选项。

答案2

我注意到你用 FreeBSD 标签标记了此内容。如果你的操作系统是 FreeBSD,那么

dump -0 -f /path/to/destination/file /what/to/dump

您需要的其他命令是

newfs /dev/ada0p1
mount /dev/ada0p1 /mnt
cd /mnt
restore -r -f /path/to/destination/file

您希望用适合您系统的设备节点替换这些设备节点。此外,您希望坚持转储整个分区,避免转储分区的部分内容。

答案3

我发现 rsync 最终能很好地完成这个任务,只是你必须删除该过程留下的剩余文件夹。不幸的是,由于文件夹占用的空间很小,所以可以忽略不计,rm 是可以接受的:

rsync -axvES --remove-source-files src_folder /dst_folder/ 
rsync -axvES --remove-source-files /old_dst_folder ./

相关内容