我有一种情况,我正在testing一个新的文件系统,有一些元数据的问题。 所有的文件都是完整的,但是我最终必须将每个文件有效地移动到另一个卷上,然后立即回到原来的位置。
显然, mv不会保留所有的属性(尤其是所有的时间戳)。 我正在想一些find命令,而exec'ing cp -p /original/path/to/file /tmp/location/file , rm /original/path/to/file , cp -p /tmp/location/file /original/path/to/file , rm /tmp/location/file 。 也许所有这些命令在脚本中传递给find exec?
我不确定这里最有效的方法,但想要一些快速的input,以确保我覆盖所有的基础,并有一个精确的命令,不会让我哀悼一些数据属性损失时,并做了。 我有几百GB的字节来回移动,所以我需要尽可能的小心和高效。
这是我迄今为止所提出的解决scheme,并且会喜欢一些input:
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 {} \;
考虑使用tar与-p (– --preserve )。 这样,你也有一个很好的tarball保持…你知道…以防万一。 没有我知道的元数据会被留下。 如果我发现是错的,我也不承担任何责任。 =)
编辑:符号链接date将不会被保留! 看到?! 永远不要相信拥有root权限的猫。
其他选项包括cplv但是您没有至less具有源的大小的卷组。 cpdup也是。 如果它全部在同一个卷组上, rsync可能是一个选项。
我注意到你已经用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
您希望将这些设备节点replace为适合您的系统的设备节点。 此外,你想坚持倾卸整个分区,并避免倾倒分区的部分。
我发现rsync最终很好地实现了这个技巧,除了你必须删除剩下的进程剩下的文件夹。 不幸的是,由于这些文件夹占用的空间很小,所以可以忽略不计,而且可以接受:
rsync -axvES --remove-source-files src_folder /dst_folder/ rsync -axvES --remove-source-files /old_dst_folder ./