Linux/Bash:创建指向目录树中文件的相对软链接?

Linux/Bash:创建指向目录树中文件的相对软链接?

我想为目录树中的所有文件创建链接。这意味着,创建相同的目录结构,并在其中创建指向原始目录中相应子目录的链接。

可以这样做

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/

相关内容