3

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

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

4

3 回答 3

5

你不需要做任何递归。链接到目录后,可以通过链接访问该目录下的所有文件和目录。

您需要的唯一链接是顶级目录……</p>

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

或者,根据您的要求,建立current一个链接data甚至可能就足够了。

于 2017-05-19T00:55:40.167 回答
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 "$@"

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

于 2020-06-20T17:07:04.683 回答
0

GNU 收藏。 https://www.gnu.org/software/stow/

尝试:

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

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

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

于 2021-02-22T23:58:15.093 回答