Список всех файлов, которые не соответствуют селектору (с использованием ls)

Возможный дубликат:
Как использовать обратные или отрицательные подстановочные знаки при сопоставлении шаблонов в оболочке unix/linux?

Я прочитал страницу man для ls, и я не могу найти параметр, чтобы отобразить все, что соответствует не. Вы знаете, как выполнить эту операцию?

Например: скажем, моя директория:

> ls
a.txt b.mkv c.txt d.mp3 e.flv

Теперь я хотел бы сделать что-то, что делает следующее

> ls -[SOME_OPTION] *.txt
b.mkv d.mp3 e.flv

Есть ли такая опция?

Если нет, есть ли способ передать вывод ls другой функции (возможно, sed), которая отображает только те, которые мне бы хотелось?

Я точно не знаю, как это сделать, но я предполагаю, что это будет что-то вроде:

> ls | sed [SOMETHING] 

Мне действительно нужно научиться использовать sed, awk и grep, но я все время зацикливаюсь на понимании того, как писать регулярные выражения. Я понимаю концепцию регулярных выражений четко, но я запутался между регулярными выражениями, использующими другой синтаксис.

Любая помощь будет очень признательна!

EDIT:

Я забыл упомянуть, что я запускаю Mac OS X, поэтому функции могут немного отличаться от тех, которые обсуждались в других ответах для оболочки unix/linux (следовательно, некоторые из моих путаницей с sed, awk, и grep).

Ответ 1

Возможно, эта команда поможет вам

find ./ -maxdepth 1 ! -path "*txt"

Ответ 2

это может помочь вам

ls --ignore=*.txt

Он не будет отображать файлы .txt в вашем каталоге.

Ответ 3

ls|grep -v ".txt"

Помогает ли это?

Ответ 4

ls просто перечисляет, какие аргументы он представляет. *.txt расширяется до a.txt c.txt, прежде чем он его увидит, попробуйте echo *.txt.

Чтобы сделать то, что вы задаете с помощью sed, вы можете удалить шаблон из его ввода, например:

ls | sed '/\.txt$/d'

Удалит все строки, заканчивающиеся на .txt.

С bash и zsh вы можете иметь оболочку для инвертированного расширения, с bash это будет:

ls !(*.txt)

ЗШ:

ls *~*.txt

Обратите внимание, что обе оболочки нуждаются в расширенной опции glob для включения, shopt -s extglob с bash и setopt extendedglob с zsh.

Ответ 5

Один из способов: find:

find . -maxdepth 1 -type f -not -name "*.txt" -printf "%f\n"