Bash:如果目标位于同一卷内,则创建硬链接,否则复制

发布于 2024-12-26 12:04:34 字数 221 浏览 0 评论 0原文

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

为了节省空间并最大限度地提高速度,我更愿意制作硬链接而不是副本,因为无论如何,所有副本都需要在其生命周期内保持相同。

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

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

My bash script makes copies of some files to some multiple directories.

In order to save space and maximize speed, I would prefer to make hardlinks instead of copies, since all copies need to remain identical during their life anyway.

The script is ran in different computers, though, and there may be the case where the destination directory exists in a different volume to the origin's. In such a case, I cannot make a hardlink and need to just copy the file.

How do I check if origin and destination directory exist in the same volume, so that I either hard link or copy depending on it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

痕至 2025-01-02 12:04:34

一个简单的方法就是尝试两者:

    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

A simple way to do so, is just to try both:

    ln "$FROM" "$TO" || cp "$FROM" "$TO"

Depending upon your purposes, creating a reference copy (which is almost as lightweight as an hardlinked file, but allows the two copies to be edited/diverge in future) might work:

    cp --reflink=auto "$FROM" "$TO"

But, you can obtain the device filesystem's device ID using stat:

    if [ $(stat -c %D "$FROM") = $(stat -c %D "$TARGET_DIR") ]; then
          ln "$FROM" "$TARGET_DIR"/
    else
          cp "$FROM" "$TARGET_DIR"/
    fi
猫瑾少女 2025-01-02 12:04:34

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

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

The easy way, by checking whether ln fails where cp succeeds:

ln $SRC $TARGET || cp $SRC $TARGET
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文