符号链接在Bash脚本中排除

时间:2015-06-24 06:03:10

标签: bash symlink

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

我已经查了过这个帖子,但它对我没有帮助:

https://serverfault.com/questions/165484/how-to-symlink-folders-and-exclude-certain-files

所以这是我目前正在使用的脚本:

#! /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

脚本应该在排除列表中查找,如果排除了扩展名,则不应该创建符号链接;它应该将文件复制到位。

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

1 个答案:

答案 0 :(得分:1)

您正在与exclude列表中的文字字符串进行比较。文件名在字面上与*.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

另请注意proper quoting of "$file" and, generally, any variable which contains a file name

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

更少侵入性的改变是使用=~代替,但是你必须切换到正则表达式而不是排除列表的glob模式。但是上面的方法也更有效,因为它避免了明确的内循环。