I'd use this approach (note I added an extra line to your example to demo the AND example):
library(tidyverse)
# target criteria
target <- c("b", "d") %>% paste(collapse = "|")
target
#> [1] "b|d"
# my data
my_data <- tribble(
~col1, ~col2, ~col3, ~col4, ~col5,
"aaa", "aaa", "aaa", "aaa", "eee",
"aaa", "bbb", "bbb", "bbb", "eee",
"bbb", "ccc", "ccc", "ccc", "eee",
"aaa", "ddd", "ddd", "ddd", "eee",
"aaa", "eee", "eee", "eee", "ddd",
"aaa", "fff", "fff", "fff", "eee",
"bbb", "bbb", "bbb", "bbb", "bbb"
)
# OR
my_data |>
filter(if_any(contains("col"), ~str_detect(.x, target)))
#> # A tibble: 5 x 5
#> col1 col2 col3 col4 col5
#> <chr> <chr> <chr> <chr> <chr>
#> 1 aaa bbb bbb bbb eee
#> 2 bbb ccc ccc ccc eee
#> 3 aaa ddd ddd ddd eee
#> 4 aaa eee eee eee ddd
#> 5 bbb bbb bbb bbb bbb
# AND
my_data |>
filter(across(contains("col"), ~str_detect(.x, target)))
#> # A tibble: 1 x 5
#> col1 col2 col3 col4 col5
#> <chr> <chr> <chr> <chr> <chr>
#> 1 bbb bbb bbb bbb bbb
Created on 2021-12-28 by the reprex package (v2.0.1)