我有一个文件夹 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 cp
,cpio
但似乎都没有使用符号链接链接到源的选项。)