【发布时间】:2010-11-17 11:00:51
【问题描述】:
在 Linux 上“复制”目录层次结构以便创建新的目录层次结构而所有“文件”只是指向源层次结构中实际文件的符号链接的最简单方法是什么?
cp -s 不能递归工作。
【问题讨论】:
标签: file shell unix directory symlink
在 Linux 上“复制”目录层次结构以便创建新的目录层次结构而所有“文件”只是指向源层次结构中实际文件的符号链接的最简单方法是什么?
cp -s 不能递归工作。
【问题讨论】:
标签: file shell unix directory symlink
我刚刚在一个 linux 机器上进行了快速测试,cp -sR /orig /dest 完全按照您的描述:创建一个目录层次结构,其中包含将非目录的符号链接返回到原始目录。
【讨论】:
cp -sR /orig /dest && symlinks -rc /dest
cp: illegal option -- s,所以如果你需要制作一个可移植的脚本,你需要一种不同的方法。
cp -as /root/absolute/path/name dest_dir
会做你想做的事。请注意,源名称必须是绝对路径,不能是相对路径。否则,你会得到这个错误:“xyz-file: can make relative symbolic links only in current directory.”
另外,请注意您要复制的内容:如果 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/{} \;
第一个实例通过仅查找原始树中的目录并在新树中重新创建它们来设置目录结构。第二个在新树中创建指向原始文件的符号链接。
【讨论】:
(cd origParentDir; find origDir .. ; find origDir ..) 可能是一个好主意,以便将相对路径作为 mkdir 和 ln -s 的参数。使用括号启动 (subshell) 因为在子shell中运行 cd 只会临时设置 CWD; CWD 在子shell 退出时恢复。例如。如果您将/src/binutils-2.24“克隆”到${HOME}/source,那么您不希望创建“src”文件夹。
ln 没有递归选项...比如ln -s -R orig/dir dest/dir。
还有“lndir”实用程序(来自 X)可以做这样的事情;我发现这里提到了它:Debian Bug report #301030: can we move lndir to coreutils or 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
黑客愉快!
【讨论】: