我正在尝试从一个目录到另一个目录运行递归符号链接:
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
。
答案 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是瑞士军刀。