Или вместо того, чтобы делать это в одном grep, используйте один grep для поиска файлов с 3 или более семью, а другой - для фильтрации 4 или более 7.
ls -f | egrep '7.*7.*7' | grep -v '7.*7.*7.*7'
Вы можете переместить часть работы в оболочку с помощью более короткого
ls -f *7*7*7* | grep -v '7.*7.*7.*7'
хотя, если существует большое количество файлов, соответствующих этому шаблону, последний не будет работать из-за встроенных ограничений на размер глобуса.
'-f' в 'ls' запрещает 'ls' сортировать результаты. Если в каталоге огромное количество файлов, то время сортировки может быть весьма заметным.
Этот двухступенчатый процесс фильтрации, я думаю, более понятен, чем использование шаблонов [^ 7].
Кроме того, вот решение в виде скрипта Python, поскольку вы запросили это как опцию.
import os
for filename in os.listdir("."):
if filename.count("7") == 4:
print filename
Это будет обрабатывать несколько случаев, которые не будут выполняться командами оболочки, например (злые) имена файлов, которые содержат символ новой строки. Хотя даже в этом случае выходные данные в этом случае, скорее всего, будут неверными или, по крайней мере, неподготовленными для последующих программ.