Список файлов, которые соответствуют шаблону, но игнорируют файлы, соответствующие другому шаблону?

Предположим, у меня есть каталог с файлами a1, a2, a3, b1, b2, b3. Я хочу только сопоставить файлы, начинающиеся с a но не содержащие 3 . Я пробовал ls -I "*3" *a* но он возвращает a1 a2 a3 , хотя я не хочу, чтобы он соответствовал a3 . Возможно ли это с помощью ls ?

    Просто:

     shopt -s extglob ls a!(*3*) 
    • shopt -s extglob активизируется расширенное подтягивание.
    • a соответствует началу
    • !() отрицает совпадение внутри ()
      • *3* который равен 3 и ничего до или после него.

     $ touch 1 2 3 a1 a2 a3 b1 b2 b3 aa1 aa2 aa3 a2a a3a $ ls a!(*3*) a1 a2 a2a aa1 aa2 

    В существующих ответах наилучшим образом указывается лучший способ сделать это с помощью глобусов; Я включу это, потому что в большинстве случаев find – лучший вариант, если вы хотите выполнить скриптинг или дальнейшую обработку:

     $ find . -maxdepth 1 -name 'a*' -not -name '*3*' ./a1 ./a2 

    Вы можете xargs ответ на xargs для удобства действий или в течение цикла while read для более сложных задач.

    Простым способом является

    • для отображения всех файлов, соответствующих a*
    • затем удалите все строки, содержащие 3

    Команда UNIX

     ls -1 a* | grep -v 3 

    ls -1 показывает один файл в строке.

    grep обычно находит строки, соответствующие шаблону, но с -v это поведение инвертируется, то есть grep находит строку, которая не соответствует этому шаблону.

    С помощью zsh , используя оператор glob :

     setopt extendedglob print -rl -- a*~*3* 

    С помощью gnu ls вы можете использовать два варианта --ignore :

     ls -I '[^a]*' -I '*3*' 

    первый игнорирует все имена файлов, которые не начинаются с a а второй игнорирует имена файлов, которые содержат 3