例如,我从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
,因为它没有做我想做的事情,仍然保留阵列中那些讨厌的元素。其他选项,比如重新创建数组,要么需要大量硬编码的排除定义,要么只是不使用通配符,需要严格匹配。
答案 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)
假设你有数组包含你想要保留的那些元素以及那些你要删除backup
或before
的元素,我只是循环遍历数组并且建立一个新的没有你不想要的条目,例如
declare -a newarray
for i in "${array[@]}"; do
[[ $i =~ backup ]] || [[ $i =~ before ]] && continue
newarray+=( "$i" )
done
不光鲜,不花哨,只需删除backup
和before
名称(不留下非连续索引)。