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

我有一种情况,我正在testing一个新的文件系统,有一些元数据的问题。 所有的文件都是完整的,但是我最终必须将每个文件有效地移动到另一个卷上,然后立即回到原来的位置。

显然, mv不会保留所有的属性(尤其是所有的时间戳)。 我正在想一些find命令,而exec'ing cp -p /original/path/to/file /tmp/location/filerm /original/path/to/filecp -p /tmp/location/file /original/path/to/filerm /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 {} \; 

任何想法或更正?

  • 我确实发现一个问题,这将是由于该文件夹的子… hrm修改ALTER文件夹date。 不知道如何克服这一个呢。

考虑使用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 ./