Rsync 检测是否在同一文件系统上传输

Rsync 检测是否在同一文件系统上传输

我想将mv命令别名化,rsync -av --progress --remove-source-files使 mv 命令更加详细。

它可以工作,但是我可以添加一种方法来检测我是否在同一个文件系统内移动文件,而是执行正常mv命令,这样它就不会复制然后删除吗?

答案1

您可以比较源和目标的文件系统标识符

stat -f -c %i /path/to/file

我认为没有任何方法可以将其压缩成别名,但编写一个简单的脚本并不难,如果你真的想要,你可以将mv这个脚本作为别名

将其放入某个文件(例如名为mvrsync)中PATH,并使其可执行(chmod a+x /path/to/mvrsync

#!/bin/bash
#
args=("$@")                                      # In this example we do not consider -flags
[[ -t 2 ]] && vp=-vP                             # Only make rsync noisy if we're on a terminal

dst="${args[-1]}"; unset args[-1]                # Single destination

dstX="$dst" dstFS=
[[ "${dstX:0:1}" != / ]] && dstX="$PWD/$dstX"    # Absolute path
while [[ -z "$dstFS" ]]; do
    dstFS=$(stat -f -c %i "$dst" 2>/dev/null)    # Look for a target that exists
    dstX="${dstX%/*}"                            # Prepare to try again with parent
done

for src in "${args[@]}"                          # Everything else must be a source
do
    # See if src and dst are on same filesystem
    srcFS=$(stat -f -c %i "$src")                # Could pre-check for file existence
    if [[ "$srcFS" == "$dstFS" ]]
    then
        # Same filesystem, use mv directly
        mv -f "$src" "$dst"
    else
        # Different filesystem
        rsync -aAXX $vp --remove-source-files "$src" "$dst"
    fi
done

请注意,写完这篇文章后,我不确定你为什么要rsync在这种情况下使用它,因为它只能充当慢速版本cp && rm,甚至是你的朋友mv

相关内容