Bash:从包含特定单词的数组中删除元素(通过通配符)

时间:2018-02-25 10:28:05

标签: arrays bash shell

例如,我从find /vms/ -mindepth 1 -maxdepth 1 -type d -printf '%f\n'获得了服务器中的一系列主机:

s01 s02 s03 s04 ... s35-backup s35-before-20150702 s36-backup-3 ...

假设我只有Bash 4.1.5,如何通过通配符过滤此数组,删除包含某些单词的字符串?例如*backup*, *before*,依此类推? 我放弃了find -o -prune,因为它没有做我想做的事情,仍然保留阵列中那些讨厌的元素。其他选项,比如重新创建数组,要么需要大量硬编码的排除定义,要么只是不使用通配符,需要严格匹配。

2 个答案:

答案 0 :(得分:1)

您可以在-not中使用find选项:

find /vms/ -mindepth 1 -maxdepth 1 -type d -not \( -name '*backup*' -o -name '*before*' \) \
-printf '%f\n'

您还可以将-not-regex

一起使用
find /vms/ -mindepth 1 -maxdepth 1 -type d -not -regex '.*\(backup\|before\).*' \
-printf '%f\n'

答案 1 :(得分:0)

假设你有数组包含你想要保留的那些元素以及那些你要删除backupbefore的元素,我只是循环遍历数组并且建立一个新的没有你不想要的条目,例如

declare -a newarray
for i in "${array[@]}"; do
    [[ $i =~ backup ]] || [[ $i =~ before ]] && continue
    newarray+=( "$i" )
done

不光鲜,不花哨,只需删除backupbefore名称(不留下非连续索引)。