Если вы хотите удалить только файлы с обоими совпадениями, awk
- это полноценный язык программирования, которому можно дать выражение, которое проверяет флаги независимо, - более уместно, чем grep
(который изменяетего состояние выхода зависит от того, найдены ли какие-либо совпадения, а не от совпадения всех приведенных выражений.
string1="first regex"
string2="second regex"
for ((x=1; x<=100; x++)); do
file="log$x.txt"
awk -v string1="$string1" -v string2="$string2" '
BEGIN { found1=0; found2=0; }
$0 ~ string1 { found1=1; }
$0 ~ string2 { found2=1; }
END { exit(!(found1 && found2)) }
' "$file" && rm -f -- "$file"
done
Эквивалент grep
будет намного меньшеэффективный, поскольку он должен читать каждый файл дважды:
# MUCH SLOWER ON BIG FILES: Reads each file twice (up to the point where a match exists)
string1="first regex"
string2="second regex"
for ((x=1; x<=100; x++)); do
file="log$x.txt"
grep -q -e "$string1" -- "$file" && grep -q -e "$string2" -- "$file" && rm -f -- "$file"
done