首页 > 解决方案 > Bash:如何从 for 循环中的多个文件的数组中删除目录的第一部分?

问题描述

我正在尝试为我编写一个管理点文件的脚本,这就是我所拥有的:

dots=(
    ~/.config/alacritty
    ~/.config/dunst
    ~/.config/flameshot
    ~/.config/i3
    ~/.config/i3status
    ~/.config/kitty
    ~/.config/nvim
    ~/.config/picom
    ~/.config/rofi
    ~/.config/gtk-3.0
    ~/.config/obs-studio
    ~/.config/sway
    ~/.config/waybar
    ~/.config/swappy
    ~/.config/mako
    ~/.config/swaylock
    ~/.config/Code/User/settings.json
    ~/.config/Code/User/keybindings.json
    ~/.config/fontconfig
    ~/.bash_logout
    ~/.bash_profile
    ~/.bashrc
    ~/.profile
    ~/.stignore
    ~/.gtkrc-2.0
)

for name in "${dots[@]}"; do
    if [ ! -e "$name" ]; then
        echo "$name does not exist."
        ln -sv "$HOME/Dotfiles/dots/${name#~/.config/}" "$name"
    else
        echo "$name exists."
    fi
done

这里的问题是它会~/.config/从目录中删除部分~/.config/sway,但不会删除~/部分~/.profile

我的问题是,我将如何使它删除~/.config/部分和~/包含它们的文件的部分?

编辑:在符号链接行中echo替换为。ln -sv我用它替换了它,echo以便我可以测试它是否有效。

标签: arraysbashshellscriptingsymlink

解决方案


我的问题是,我将如何使它删除 ~/.config/ 部分和 ~/ 具有它们的文件的部分?

就个人而言,我会分两步完成,将中间结果存储在一个单独的变量中:

        local_part=${name#~/}
        ln -sv "$HOME/Dotfiles/dots/${local_part#.config/}" "$name"

推荐阅读