Назад | Перейти на главную страницу

ls | grep regex, игнорировать файлы с расширением .tab,

Я знаю какое-то регулярное выражение, но не знаю, как заставить его работать. Я хочу перечислить все файлы, у которых нет .tab. и не имеют ~ в конце имени файла и не являются .o (или .bin)

Я могу перечислить все файлы с расширением .tab. написав

ls | grep .tab.

Однако я не могу понять, как заставить его игнорировать эти файлы и перечислить все остальное. Я попытался

ls | grep [^(.tab.)]

но получил ошибку и подумал, что мое последнее регулярное выражение будет

ls | grep ([^(.tab.)]|.o$|.bin$)

Но я никогда не делал много регулярных выражений, поэтому я уверен, что финал неправильный, даже если синтаксис был правильным.

Как я это сделаю, будет зависеть от контекста. Если бы это не было для сценария, а я просто хотел бы это увидеть, я бы согласился использовать ls:

ls -a | egrep -v '(tab|\.o$|\.bin$|~$)'

Если бы в сценарии, я бы использовал цикл:

for file in *; do
#file $file in .* *; do   -- To Include dot (hidden files)                     
   if ! egrep -q '(tab|\.o$|\.bin$|~$)' <<<$file; then
      echo $file
   fi
done

Вы можете добавить еще один if test с -f, если вам нужны только обычные файлы, а не каталоги. Если вы хотите сделать это рекурсивно, вы можете использовать GNU find с тестом -regex и posix-egrep. Но примите во внимание тот факт, что это регулярное выражение будет соответствовать полному пути относительно каталога, в котором вы выполняли поиск.

Еще один хороший вариант - расширенные глобусы, если у вас есть поддержка, см. Ответ Денниса.

В -v/--invert-match опция делает строки вывода grep, которые делают не соответствие. Так:

ls | grep -v .tab.

или

ls | grep --invert-match .tab.

в твоем случае.

shopt -s extglob
ls -l !(*.bin|*.o|*~|*.tab.*)

ls | egrep -v (.tab|.o$|.bin$)

должен это сделать. egrep - это в основном grep -E, который поддерживает «расширенное» регулярное выражение, поэтому такие вещи, как (x | y), работают.