Исключить строку из подстановочного поиска в оболочке

Я пытаюсь исключить определенную строку из поиска файла.

Предположим, у меня есть список файлов: file_Michael.txt, file_Thomas.txt, file_Anne.txt.

Я хочу быть в состоянии и написать что-то вроде

ls *<and not Thomas>.txt

чтобы предоставить файл file_Michael.txt и file_Anne.txt, но не файл_Thomas.txt.

Обратное легко:

ls *Thomas.txt

Выполнение этого с одним символом также легко:

ls *[^s].txt

Но как это сделать со строкой?

Себастьян

Ответ 1

Вы можете использовать find для этого:

$ find . -name '*.txt' -a ! -name '*Thomas.txt'

Ответ 2

с bash

shopt -s extglob
ls !(*Thomas).txt

некоторые другие способы

find . -type f \( -iname "*.txt" -a -not -iname "*thomas*" \)

ls *txt |grep -vi "thomas"

Ответ 3

Если вы зацикливаете подстановочный знак, просто пропустите оставшуюся часть итерации, если есть что-то, что вы хотите исключить.

for file in *.txt; do
    case $file in *Thomas*) continue;; esac
    : ... do stuff with "$file"
done