Linux 上“复制”目录层次结构的最简单方法是什么,以便创建新的目录层次结构,而所有“文件”只是指向源层次结构上实际文件的符号链接?
cp -s
不能递归工作。
我刚刚在 linux 机器上做了一个快速测试,cp -sR /orig /dest
并完全按照您的描述进行:创建一个目录层次结构,其中非目录的符号链接返回到原始目录。
cp -as /root/absolute/path/name dest_dir
会做你想做的。请注意,源名称必须是绝对路径,不能是相对路径。否则,您将收到此错误:“xyz 文件:只能在当前目录中建立相对符号链接。”
另外,请注意您要复制的内容:如果 dest_dir 已经存在,则必须执行以下操作:
cp -as /root/absolute/path/name/* dest_dir/
cp -as /root/absolute/path/name/.* dest_dir/
从原始目录和新目录的上方开始,我认为这对find(1)
命令将满足您的需求:
find original -type d -exec mkdir new/{} \;
find original -type f -exec ln -s {} new/{} \;
第一个实例通过仅在原始树中查找目录并在新树中重新创建它们来设置目录结构。第二个在新树中创建指向原始文件的符号链接。
还有“lndir”实用程序(来自 X)可以做这样的事情;我发现这里提到了它:Debian 错误报告 #301030:我们可以将 lndir 移动到 coreutils 或 debianutils 吗?,我现在很高兴地使用它。
如果您想弄脏自己的手 这里有一个技巧,它将自动递归地创建目标文件夹、子文件夹和符号链接所有文件。
在要符号链接的文件和子文件夹所在的文件夹中:
创建一个文件 shell.sh:
nano shell.sh
#!/bin/bash
export DESTINATION=/your/destination/folder/
export TARGET=/your/target/folder/
find . -type d -print0 | xargs -0 bash -c 'for DIR in "$@";
do
echo "${DESTINATION}${DIR}"
mkdir -p "${DESTINATION}${DIR}"
done' -
find . -type f -print0 | xargs -0 bash -c 'for file in "$@";
do
ln -s "${TARGET}${file}" "${DESTINATION}${file}"
done' -
ctrl+O
ctrl+X
使您的脚本可执行chmod 777 shell.sh
运行你的脚本./shell.sh
快乐黑客!
我知道这个问题是关于 shell 的,但是因为你可以从 shell 调用 perl,所以我写了一个工具来做与此非常相似的事情,并在几年前将它发布在perlmonks上。就我而言,我通常希望目录保持链接,直到我另有决定。自动和递归地执行此操作将是一个相当微不足道的更改。