将文件从一台设备移到另一台设备

我试图自动化我们的centOS服务器上的远程备份,我运行当前的命令:

nice -n 10 mv -vfb /media/localbackup/* /media/remotebackup/ 

然而,当这是跑了我得到以下错误,没有文件被移动

 mv: inter-device move failed: `/media/localbackup/04-21-13' to `/media/remotebackup/04-21-13'; unable to remove target: Is a directory 

我已经被告知最好是使用cp,但这不会删除文件后,我需要删除成功备份的文件。

我也build议你使用rsync而不是mv ,但join@ Hartmut的答案是 :

 rsync -abmv --remove-source-files /media/localbackup /media/remotebackup/ find /media/localbackup -depth -type d -empty -delete 

还有两个补充:

  1. rsync-m (– --prune-empty-dirs )参数,在我的3.0.7版本的协议版本30上说:从文件列表中--prune-empty-dirs空的目录链,但是由于某种原因没有这样做。 不要错( 不是唯一的一个注意到它 )。
  2. find命令将删除空目录。

现在, 反对 cp && rm的原因是cp可能会中途失败。 下一次你想备份你将会出现一个奇怪的情况(部分复制文件来命名最坏的情况)。 另外,下一个备份将不知道如何处理以前备份的文件,这些文件没有被删除。 另一方面, rsync覆盖这些方面就好了。

此外,使用脚本(作为第一个答案build议)做rsync已经做了什么,但更糟的是,是一个不行(对不起Hauke Laging :-))。 没有必要在这里重新发明轮子。

我发现我经常想在文件上做一些操作,同时保留它们的目录结构。 出于这个原因,我定义了一个bash函数filtercmd 。 这需要一个文件列表作为标准input,并作为参数采取操作(如mv )和目的地目录。 一旦我这样做了,我可以做这样的事情,作为一个简单的class轮。

 filtercmd () { if [ ! -d "$2" ]; then echo "$2" does not appear to be a directory; return 1; fi while read f; do dir="${f%/*}" if [ ! "$dir" = "$lastdir" ] then mkdir -p "$2/$dir"; echo "$dir"; lastdir="$dir"; fi [ -e "$2/$f" ] || $1 "$f" "$2/$f"; done } (cd /media/localbackup && find . | filtercmd "mv -vfb" /media/remotebackup) 

这也可以用rsync完成。 使用rsync的远程协议可以节省大量的带宽,因为协议只需要发送更改的块。 但是, filtercmd优于rsync两个优点是(1)您可以使用现有的mv标志,而无需了解rsync等价物,(2)我们也可以使用filtercmd来实现更强大的function,如:

 (z(){ grep . <$1|gzip >$2.gz;};find . -name '*.txt' | filtercmd z ../gz }) 

其中有select地采取txt文件,消除空行,并gzips他们到目的地目录。

您的命令尝试创build一个已经存在的目录。 你应该使这个shell代码更健壮:

 tmpdirname=tmpdir test -d "/media/remotebackup/${tmpdirname}" && rm -rf "/media/remotebackup/${tmpdirname}" pushd /media/localbackup/ test -d "$tmpdirname" && { echo Abbruch; exit 1; } for dir in *; do test -d "/media/remotebackup/${dir}" && continue mv "$dir" "/media/remotebackup/${tmpdirname}" && mv "/media/remotebackup/${tmpdirname}" "/media/remotebackup/${dir}" done popd 

这将跳过已成功移动的目录。

我将使用带有–remove-source-files选项的rsync命令。

rsync -abv --remove-source-files /media/localbackup/* /media/remotebackup/

请在将其应用于您的环境之前进行testing。