我想将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