我想为目录树中的所有文件创建链接。这意味着,创建相同的目录结构,并在其中创建指向原始目录中相应子目录的链接。
可以这样做
cp -R -s ../foo .
但是 - 这需要绝对路径。因此
cp -R -s `readlink -e ../foo` `readlink -e .`
我希望生成的链接是相对的。
有没有简单的方法?例如专门用于此目的的一些脚本或程序。
答案1
此脚本应该可以满足您的要求。它比您预期的要复杂一些,因为它需要能够处理任意文件和目录名称。包括带有换行符、空格和通配符的名称。它应该适用于您给出的任何名称。
#!/usr/bin/env bash
sourceDir="$1"
targetDir="."
## The name of the source directory without its path
## First, we need to strip the trailing `/` if present.
sourceDir="${sourceDir%/}"
sourceName="${sourceDir##*/}"
## Find all files and directories in $source. -print0
## is needed to deal with names with newlines
find "$sourceDir" -mindepth 1 -print0 |
## Read eacch file/dir found into $f. IFS= ensures
## we can deal with whitespace correctly and -d ''
## lets 'read' read null-separated values. The -r
## ensures that backspaces don't have special meaning. All
## this to be certain that this will work on arbitrary file names.
while IFS= read -r -d '' f; do
##
name="${f##$sourceDir}"
## Build the relative path for the symlink
relname=$(perl -le '$ARGV[0]=~s|/[^/]+|/..|g;
$ARGV[0]=~s|../..$|$ARGV[1]/$ARGV[2]|;
print $ARGV[0]' "$f" "$sourceName" "$name")
## If this is a directory, create it
if [ -d "$f" ]; then
mkdir -p "$targetDir/$name"
## If a file, link to it.
else
ln -s "$relname" "$targetDir/$name"
fi
done
保存脚本并使其可执行,然后将其cd
放入目标目录并以源目录作为参数运行脚本。例如,要复制当前目录中的目录../target
,请运行:
foo.sh ../target/