递归符号链接目录树

时间:2017-05-19 00:00:42

标签: bash macos recursion ln

我正在尝试从一个目录到另一个目录运行递归符号链接:

find data/* -type d -exec ln -s {} current/{} \;

添加一个:我需要从前缀中删除data/

在OS X服务器(10.8,Mountain Lion)上运行 - 并非支持所有标准GNU命令,如cp -rs

我的意思是递归:

data是Laravel版本之间的持久目录列表:

data/
    \ storage/
        - framework/
            - session/
        - app/
        \ logs/

他们需要映射到:

current/
    \ storage/
        - framework
            - session/
        - app/
        - logs/
      # Also in storage, but we do NOT want to persist
        - debugbar/
        - framework/
            - cache/
            - views/

我们的data目录将是应用程序启动之间的持久存储,因为我们更新了我们的网站,同时在回滚时保留了以前版本的网站(current恰好是软件链接最新发布)。

注意:除了Laravel之外,我们还有其他网站。 data将成为我们的标准,我们将根据站点对持久性的要求来匹配目录重组。它并不总是data/storage

3 个答案:

答案 0 :(得分:2)

您不需要进行任何递归。一旦链接到目录,就可以通过链接访问其下的所有文件和目录。

您需要的唯一链接是顶级目录...

cd current
ln -s ../data/*/ .

或者,根据您的要求,将current链接到data甚至可能就足够了。

答案 1 :(得分:1)

我正在回答如何将所有文件从一个目录递归链接到另一个目录。

我需要这个并且找不到macOS周围的任何好的解决方案。

以下是最好的解决方案:

cp -Rs <src_dir> <dest_dir>

否则,我所做的是:

#! /usr/bin/env bash

symlink_recursive_copy() {
    local src_dir=$1 ; shift
    local target_dir=$1
    local basename
    local cdir
    local full_path_cdir
    local full_path_target_dir
    local opwd=$PWD

    if [ -e "$target_dir" ]
    then
        >&2 echo "$target_dir already exists"
        return 1
    fi

    target_dir="$opwd/${target_dir##*/}"

    cd "$src_dir"

    while IFS= read -r -d '' file
    do
        basename="${file##*/}"
        cdir="${file%/*}"
        cd "$cdir" ; full_path_cdir=$PWD ; cd "$OLDPWD"
        mkdir -p "$target_dir/$cdir"
        ln -s "$full_path_cdir/$basename" "$target_dir/$cdir/$basename"
    done < <( find . -type f -print0 )

    cd "$opwd"
}

symlink_recursive_copy "$@"

以上内容适用于包含换行符,空格,引号,尾随换行符等的任何类型的文件。

答案 2 :(得分:0)

GNU 存储。 https://www.gnu.org/software/stow/

试试:

# cd to dir above ./data
mkdir datalinks
stow -d datalinks data

Stow 也将智能地处理源目录中的现有文件。如果 dit 不存在,它将对目录进行符号链接,但如果存在,它将对内容进行符号链接。

需要一段时间才能理解它,但是一旦你做到了,它就开辟了一种思考文件/符号链接管理的新方式。 想想一个人烟稀少的树,其中只有新文件是实际文件,而其他所有文件都是之前文件的符号链接——你有苹果的时间机器。如果您曾经浏览过 shell 中的时间机器备份,您会发现它与 rsnapshot 备份相同。 全部基于稀疏树符号链接种群,其中stow是瑞士军刀。