Bash:如果目标在同一卷内,则创建硬链接,如果不在,则复制

Bash:如果目标在同一卷内,则创建硬链接,如果不在,则复制,bash,volume,hardlink,Bash,Volume,Hardlink,我的bash脚本将一些文件复制到多个目录中 为了节省空间和最大限度地提高速度,我宁愿制作硬链接而不是副本,因为所有副本在使用过程中都需要保持相同 不过,该脚本在不同的计算机上运行,并且可能存在这样的情况:目标目录存在于与源目录不同的卷中。在这种情况下,我无法进行硬链接,只需复制文件 如何检查源目录和目标目录是否存在于同一卷中,以便根据它进行硬链接或复制?简单的方法是,检查ln在cp成功时是否失败: ln $SRC $TARGET || cp $SRC $TARGET 要做到这一点,一个简单的方

我的bash脚本将一些文件复制到多个目录中

为了节省空间和最大限度地提高速度,我宁愿制作硬链接而不是副本,因为所有副本在使用过程中都需要保持相同

不过,该脚本在不同的计算机上运行,并且可能存在这样的情况:目标目录存在于与源目录不同的卷中。在这种情况下,我无法进行硬链接,只需复制文件


如何检查源目录和目标目录是否存在于同一卷中,以便根据它进行硬链接或复制?

简单的方法是,检查
ln
cp
成功时是否失败:

ln $SRC $TARGET || cp $SRC $TARGET

要做到这一点,一个简单的方法就是尝试以下两种方法:

    ln "$FROM" "$TO" || cp "$FROM" "$TO"
根据您的目的,创建参考副本(它几乎与硬链接文件一样轻量级,但允许将来编辑/分离这两个副本)可能会起作用:

    cp --reflink=auto "$FROM" "$TO"
但是,您可以使用
stat
获取设备文件系统的设备ID:

    if [ $(stat -c %D "$FROM") = $(stat -c %D "$TARGET_DIR") ]; then
          ln "$FROM" "$TARGET_DIR"/
    else
          cp "$FROM" "$TARGET_DIR"/
    fi

cp-l不就是跨设备故障吗?另外,由于硬链接保留了“所有”元数据,我建议
cp-al
(或第一个变体中的
cp-a
)@sehe:
cp-l
失败是我的第二个想法,尝试了,失败了。所以,没有好的选择,谢谢你的提示。第一个选项似乎是最好的(尽管ln失败时的错误消息有点令人讨厌)。另外两个解决方案存在跨平台问题(我在Mac OS X上试用过,它似乎不支持reflinks,而且它的
stat
命令(显然取自BSD)也不接受
-c
参数)。