我遇到过这种情况:我正在测试一个新文件系统,但其中的一些元数据有问题。所有文件都完好无损,但我最终必须有效地将每个文件移至另一个卷,然后立即放回原位。
显然mv
不会奏效,因为它无法保留所有属性(特别是所有时间戳)。我在考虑在执行cp -p /original/path/to/file /tmp/location/file
、rm /original/path/to/file
、cp -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 ./