Bash 符号链接(ln)文件夹不';I don’我没有按预期工作

Bash 符号链接(ln)文件夹不';I don’我没有按预期工作,bash,symlink,Bash,Symlink,我正在创建一个脚本,基本上查找以.symlink结尾的所有内容,并尝试创建一个指向$HOME目录的符号链接,删除symlink部分,并在名称前面添加点 下面一行显示了如何创建目的地 dst="$HOME/.$(basename "${src%.*}")" 为此创建了两个函数 create_symlink () { local src=$1 dst=$2 # Create the symlink ln -s -i "$src" "$dst" message "Linked $1

我正在创建一个脚本,基本上查找以
.symlink
结尾的所有内容,并尝试创建一个指向
$HOME
目录的符号链接,删除
symlink
部分,并在名称前面添加

下面一行显示了如何创建目的地

dst="$HOME/.$(basename "${src%.*}")"
为此创建了两个函数

create_symlink () {
  local src=$1 dst=$2

  # Create the symlink
  ln -s -i "$src" "$dst"
  message "Linked $1 -------> $2" # This just use echo
}

run_symlinks() {
  message "Creating Symlinks"

  local root=$1

  # Find the files/folder and try to do the symlink
  for src in $(find -H $root -name '*.symlink')
  do
    dst="$HOME/.$(basename "${src%.*}")"

    create_symlink "$src" "$dst"
  done
}
问题

我有一个名为atom.symlink的文件夹,该文件夹基本上为我的环境配置了一些atom文本编辑器的文件。当我运行
run\u symlinks
功能时,文件夹正在同步,但位置不正确。

消息“Linked$1------>$2”的输出为:

Linked $HOME/.dotfiles/src/symlinks/atom.symlink -------> $HOME/.atom
但当我查看文件夹时,符号链接实际上是指向
$HOME/.atom/atom.symlink
,而不仅仅是指向
.atom
文件夹

注意:
$HOME/.atom
文件夹不是空的,我需要弄清楚如何制作这个脚本,而不用担心文件夹是空的

我试图在谷歌上找到答案,但我甚至不知道如何问这个具体问题。

来自:

在脚本的第一次迭代之后,您已经

$HOME/.atom/ -> $HOME/.dotfiles/src/symlinks/atom.symlink # This is the first form in above man page snippet.
在第二次迭代中,您将进入第三种形式,因为目标已经存在&在符号链接取消引用之后,它是一个目录

因此,命令运行是相同的:

  ln -s -i $HOME/.dotfiles/src/symlinks/atom.symlink $HOME/atom
唯一的区别是,在第二次迭代中,目标是一个现有目录(在取消引用之后)

因此,您应该首先删除目标(
rm-f“$dst”
),然后创建一个符号链接。幸运的是,
ln
可以自己完成:

将代码更改为:

ln -sfn "$src" "$dst" # Note that with -f & -n in place, usage of -i is moot.
发件人:

在脚本的第一次迭代之后,您已经

$HOME/.atom/ -> $HOME/.dotfiles/src/symlinks/atom.symlink # This is the first form in above man page snippet.
在第二次迭代中,您将进入第三种形式,因为目标已经存在&在符号链接取消引用之后,它是一个目录

因此,命令运行是相同的:

  ln -s -i $HOME/.dotfiles/src/symlinks/atom.symlink $HOME/atom
唯一的区别是,在第二次迭代中,目标是一个现有目录(在取消引用之后)

因此,您应该首先删除目标(
rm-f“$dst”
),然后创建一个符号链接。幸运的是,
ln
可以自己完成:

将代码更改为:

ln -sfn "$src" "$dst" # Note that with -f & -n in place, usage of -i is moot.
作为补充,这很好地解释了您的方法的问题:

想要在
$HOME
中保留可能预先存在的(非符号链接)目标文件夹,并将其添加到其内容中,需要一种根本不同的方法

解决此问题的唯一方法是避免将
*.symlink
目录本身进行符号链接;相反,这些目录中的文件必须单独符号链接到目标文件夹,该文件夹既可以是预先存在的文件夹,也可以是按需创建为常规文件夹的文件夹。
这是确保目标文件夹的现有内容不会(总是)丢失的唯一方法:

而IFS=read-rf;做
#从文件路径中删除$root,然后删除后缀“.symlink”并添加前缀“.”
#到路径组件以获取链接路径。
link=“$HOME/$(sed's#\([^/]\{1,\}\)\。符号链接\(/\{0,1\}\)\。。\1\2#g'作为补充,这很好地解释了您的方法的问题:

想要在
$HOME
中保留可能预先存在的(非符号链接)目标文件夹,并将其添加到其内容中,需要一种根本不同的方法

解决此问题的唯一方法是避免将
*.symlink
目录本身进行符号链接;相反,这些目录中的文件必须单独符号链接到目标文件夹,该文件夹既可以是预先存在的文件夹,也可以是按需创建的常规文件夹。
这是确保目标文件夹的现有内容不会(总是)丢失的唯一方法:

当IFS=read-rf;do
#从文件路径中删除$root,然后删除后缀“.symlink”并添加前缀“.”
#到路径组件以获取链接路径。

link=“$HOME/$(sed's#\([^/]\{1,\}\)\.symlink \(/\{0,1\}\)\\.\1\2#g'这是带有代码的repo:.symlink
这是带有代码的回购协议:另一方面,
basename
实际上有两个参数,第二个参数是可选的。第二个参数是要删除的可选后缀。因此,在这种情况下,
basename“${src%.*}”
basename“src”相同.symlink
明白了!我有了更深层的层次!这就是为什么我把
查找
放在同一个层次上,我会考虑这样做的。非常感谢!@yordprietolazo:现在要求变得更清楚了,我已经完全重写了答案。哦,所以OP希望
blablablabla.symlink/*
应该是sym链接到
$HOME/.blabla/
@anishsane:我想他希望
blabla.symlink/*
中的单个文件被添加到
$HOME/.blablabla
(作为带有原始基名的符号链接),其中
$HOME/.blablabla
可能已经存在(作为常规目录),在这种情况下,必须保留其现有内容。(我刚刚修复了重命名逻辑中的一个错误。)明白了!我有更深层的层次,这就是为什么我把
find
放在同一个层次上,我会考虑这样做的。非常感谢!@YordisPrietoLazo:现在要求变得更清楚了,我已经完全重写了答案。哦,OP希望
blablabla.symlink/*
应该在
$HOME/.blabla/
@anishsane:我想他想把
blabla.symlink/*
中的单个文件添加到
$HOME/.blablabla
(作为