如何复制文件夹结构并建立文件的符号链接?

如何复制文件夹结构并建立文件的符号链接?

我有一个文件夹 SOURCE,其中包含几个子级文件夹,每个文件夹都有自己的文件。

我想将此文件夹复制到一个新文件夹 COPY 中,我需要在其中复制目录结构,但将文件保留为 SOURCE 及其子文件夹中原始文件的符号链接。

答案1

以下是非嵌入式 Linux 和 Cygwin 上的解决方案:

cp -as SOURCE/ COPY

请注意,SOURCE 必须是绝对路径并带有尾部斜杠。如果你想给出相对路径,你可以使用

cp -as "$(pwd)/SOURCE/" COPY

答案2

至少有 2 个标准实用程序可以构建现有树的影子目录树,因此无需在此处编写代码。

首先是包裹lndir(1)里的东西xutils-dev。它使用文件的符号链接。从手册页:

NAME
   lndir  -  create a shadow directory of symbolic links to another
             directory tree
SYNOPSIS
   lndir [ -silent ] [ -ignorelinks ] [ -withrevinfo ] fromdir [ todir ]

也许更好的选择是简单地使用cp正确的选项,如已接受的答案所示。我只会提供一些更有希望有用的细节:

cp -al /src/dir /dest/dir    # hard-links to leaf-files
cp -as /src/dir /dest/dir    # symlinks to leaf-files

如果您不关心保留所有属性(所有权/权限、时间),请将选项a(相当于-dr --preserve=all)替换为r(仅限递归):

cp -rl /src/dir /dest/dir    # hard-links to leaf-files
cp -rs /src/dir /dest/dir    # symlinks to leaf-files

答案3

您可以尝试几个这样的查找命令:

mkdir FULL-PATH-TO-COPY
cd SOURCE
find . \( ! -regex '\.' \) -type d -exec mkdir FULL-PATH-TO-COPY/{} \;
find * -type f -exec ln -s `pwd`/{} FULL-PATH-TO-COPY/{} \;

答案4

像这样的 POSIX 脚本就可以满足您的需要。

#!/bin/sh
#
SOURCE="$1" COPY="$2"
cd "$SOURCE"
find . |
    sed 's!^\./!!' |
    while IFS= read -r ITEM
    do
        if test -d "$ITEM"
        then
            mkdir -p "$COPY/$ITEM"
            continue
        fi
        BASE="${FILE%\/*}"
        ( cd "$COPY/$BASE" && ln -s "$SOURCE/$ITEM" )
    done

在目标 COPY 树中创建目录。其他所有内容都被符号链接回 SOURCE 树中的绝对路径。确保 SOURCE 和 COPY 都指定为绝对路径(以 开头/)。

如果您要复制一棵大树并且想要每个目录的进度报告,您可以在命令echo "$ITEM" >&2;之前添加mkdir

(我查看了 POSIX cpcpio但似乎都没有使用符号链接链接到源的选项。)

相关内容