Você pode fazer uma correspondência de padrões em um loop.
for file in ./???; do
[[ -e $file && $file = *[By]* ]] || continue
printf 'Do stuff with <%s>\n' "$file"
done
Ou você pode ativar os globs estendidos executando shopt -s extglob
. Então você pode usar algo como @([By]??|?[By]?|??[By])
shopt -s extglob
for file in ./@([By]??|?[By]?|??[By]); do
[[ -e $file ]] || continue
printf 'Do stuff with <%s>\n' "$file"
done
Ou será mais eficiente do que envolver grep
.
Se você estiver criando scripts para o POSIX sh, poderá fazer algo assim:
for file in ./???; do
[ -e "$file" ] || continue
case $file in
*[By]*) : ;;
*) continue;;
esac
printf 'Do something with <%s>\n' "$file"
done
Por último, você pode usar três globs, embora isso imite os arquivos em uma ordem diferente e você corre o risco de repetir o mesmo arquivo várias vezes.
for file in ./[By]?? ./?[By]? ./??[By]; do
[ -e "$file" ] || continue
printf 'Do something with <%s>\n' "$file"
done