微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Bash:如何从 for 循环中的多个文件的数组中删除目录的第一部分?

如何解决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 替换它,以便我可以测试它是否有效。

解决方法

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

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

WITH duplicated AS ( 
    SELECT id,count(*) 
    FROM products 
    GROUP BY id 
    HAVING count(*) > 1),ordered AS ( 
    SELECT p.id,created_at,rank() OVER (partition BY p.id ORDER BY p.created_at) AS rnk 
    FROM products o 
    JOIN     duplicated d ON d.id = p.id ),products_to_delete AS ( 
    SELECT id,created_at 
    FROM   ordered 
    WHERE  rnk = 2
) 
DELETE 
FROM products 
USING products_to_delete 
WHERE products.id = products_to_delete.id 
    AND products.created_at = products_to_delete.created_at;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。