我正在尝试编写一个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
脚本应该在排除列表中查找,如果排除了扩展名,则不应该创建符号链接;它应该将文件复制到位。
目前,脚本会创建目录的符号链接,但其中的所有内容都会被复制。
答案 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模式。但是上面的方法也更有效,因为它避免了明确的内循环。