【问题标题】:Copy symbolic link and the file in Shell [closed]复制符号链接和Shell中的文件[关闭]
【发布时间】:2021-09-09 08:07:30
【问题描述】:

我有一个临时目录结构,如下所示:

drwxr-xr-x 2 root root 4.0K Sep  9 11:37 file1
drwxr-xr-x 2 root root 4.0K Sep  9 11:38 file2
lrwxrwxrwx 1 root root    6 Sep  9 11:38 LATEST -> file1

我想复制最新的符号链接和它指向的文件/文件夹。现在我使用cp -d,它只复制符号链接而不是它指向的文件。有什么办法可以实现吗?

【问题讨论】:

  • @darecoder :您没有发布您尝试过的cp 命令,并且不清楚您想要实现的目标:复制符号链接的想法 together 与原始文件对我来说没有多大意义,除非考虑在某处创建完整目录树的副本的用例,并且 all 符号链接仅在此树内。但是,在这种情况下,您不会使用 cp 创建副本,而是使用 rsync,这使您可以更好地控制复制过程。
  • cp -d LATEST /home/target/ 这是我使用的命令。符号链接和文件都在同一个位置。我的用例是为此文件夹进行备份。 @user1934428
  • 你是不是错过了-r这个选项?除此之外:符号链接是相对的还是绝对的?如果它们是相对的,那么您的命令应该已经完成​​了您想要的操作。如果没有,请发布一个生成错误副本的案例。
  • 那么,在这种情况下,您想要复制符号链接目标,无论它是什么,以及符号链接本身,而不是其他任何东西?

标签: linux bash shell unix symlink


【解决方案1】:

您可以找到带有realpath 的文件/文件夹的名称,复制它,然后在目标位置创建一个新链接:

cp_with_link(){
    src="$1"
    srcdir="${1%/*}"
    srcbase="${1##*/}"
    dstdir="$2"

    if ! [ -d "$srcdir" ] || ! [ -L "$src" ]; then
        echo 1>&2 source symlink does not exist
        return 1
    fi
    if ! [ -d "$dstdir" ]; then
        echo 1>&2 destination directory does not exist
        return 2
    fi

    realsrc=$(realpath "$src")

    if ! [ -f "$realsrc" ] || ! [ -d "$realsrc" ]; then
        echo 1>&2 source symlink points to non-existent location
        return 3
    fi

    realbase="${realsrc##*/}"

    cp -R "$realsrc" "$dstdir/$realbase"
    ln -s "$realbase" "$dstdir/$srcbase"
}


cp_with_link "/path/to/temp/dir/LATEST" "/home/target"

使用realpath 并重新创建符号链接可以处理符号链接最初指向源目录之外的情况。

【讨论】:

  • 或者一些来源推荐realpath而不是readlink。前者的选项有点不同,但在这里也可以使用。
【解决方案2】:

cp -rL /source /destination

-r 参数用于递归,如果您愿意的话。 -L 参数是跟随符号链接并展开它然后复制内容。

【讨论】:

  • 如果你在链接上这样做,你将重命名目标文件/文件夹,随后的cp -d将失败
猜你喜欢
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
相关资源
最近更新 更多