Bash脚本中的符号链接排除

Bash脚本中的符号链接排除,bash,symlink,Bash,Symlink,我正在尝试编写一个Bash脚本,它将创建符号链接,但不包括某些文件 我已经查找了此线程,但它对我没有帮助: 这就是我目前使用的脚本: #! /bin/bash target=/home/csgo/game/output cs=/home/csgo/game/csgo-deagle1 exclude=( "*.conf" "*.cfg" "*txt" "*.ini" "*.smx" "*.mp3" "*.sh" ) for file in ${cs}; do for (( i

我正在尝试编写一个Bash脚本,它将创建符号链接,但不包括某些文件

我已经查找了此线程,但它对我没有帮助:

这就是我目前使用的脚本:

#! /bin/bash
target=/home/csgo/game/output
cs=/home/csgo/game/csgo-deagle1

exclude=( "*.conf" "*.cfg" "*txt" "*.ini" "*.smx" "*.mp3" "*.sh" )    

for file in ${cs}; do
    for (( index = 0; index < ${#exclude[@]}; index++ )); do
        if [[ ${file} != ${exclude[${index}]} ]]; then
            ln -s ${file} ${target}
        elif [[ ${file} == ${exclude[${index}]} ]]; then
            cp ${file} ${target}
        fi 
    done
done
#/bin/bash
target=/home/csgo/game/output
cs=/home/csgo/game/csgo-deagle1
排除=(“*.conf”“*.cfg”“*txt”“*.ini”“*.smx”“*.mp3”“*.sh”)
用于${cs}中的文件;做
对于((index=0;index<${排除[@]};index++);做
如果[${file}!=${exclude[${index}]}]];然后
ln-s${file}${target}
elif[${file}==${exclude[${index}]}]];然后
cp${file}${target}
fi
完成
完成
脚本应查看排除列表,如果扩展被排除,则不应创建符号链接;它应该将文件复制到适当的位置


此时,脚本创建了目录的符号链接,但其中的所有内容都被复制。

您正在与
排除列表中的文字字符串进行比较。文件名与
*.conf
不完全相同,因此比较返回false

无论如何,我会跳过数组,只使用
case

#! /bin/bash

# I don't see the value of these variables, but more power to them
target=/home/csgo/game/output
cs=/home/csgo/game/csgo-deagle1

# Hmmm, this will only loop over the actual directory name.
# Do you mean for file in "$cs"/* instead?
for file in $cs; do
    case $file in
      *.conf | *.cfg | *txt | *.ini | *.smx | *.mp3 | *.sh )
        cp "$file" "$target";;
      * )
        ln -s "$file" "$target";;
    esac
done
另请注意

(现在这个脚本中没有Bash特定的内容,因此您也可以将shebang更改为
#!/bin/sh


一个不太具侵入性的更改是使用
=~
,但是您必须切换到正则表达式,而不是排除列表的glob模式。但是上面的方法也更有效,因为它避免了显式的内部循环。

作为旁注,
elif
是多余的。
if
已经评估了条件,而
cp
应该只是在
else
分支中。无需再次对同一事物进行测试。更切切的是,代码> ${file } /代码>相当于<代码> $file 。当需要在其他文本的中间插入变量时,括号仅是必要的和有用的,如<代码> fo${file } bar < /代码> vs>代码> fo.$FILBARA(后者指的是一个可能不存在的变量
$filebar
)我假设扩展名前没有点的
*txt
不是打字错误;如果是,显然,你会想更正它。嗯,也许我的解释不正确。我有一个目录,它是主目录。脚本应该检查目录中的每个文件,并创建一个符号链接。例如,当文件是一个配置文件时,如“test.cfg”或排除列表中列出的其他内容,它应该复制它。符号链接文件和复制文件的输出应该放在输出目录中。我在Bash中不是很好,所以这对我来说非常困难:DApart来自我在代码中评论过的原始脚本中的错误(循环目录中的文件,而不仅仅是目录名)我相信这应该满足你的要求。如果失败了,怎么会失败?好吧,我用编辑过的版本替换了脚本,但它似乎没有做任何更改。它在输出目录中创建了一个符号链接文件夹,但其中的所有内容都没有符号链接。在线程的主Scipt中,他们使用了如下符号链接命令:ln-s${file}${target}/${file}我不知道这是否有帮助如果您没有更改为在“$cs”/*
中对文件使用
,那么这就是您仍然需要解决的问题。显然,在重试之前,您需要删除到源目录的符号链接。