Перечислите все файлы, которые не соответствуют селектору (с помощью 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,awkgrep, но я все еще застреваю в понимании того, как писать регулярные выражения. Я хорошо понимаю концепцию регулярных выражений, но я путаюсь между регулярными выражениями, которые используют другой синтаксис.

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

Редактировать:

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

5 11

5 ответов:

Может быть, эта команда поможет вам

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

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

Ls -- ignore=*.txt

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

ls|grep -v ".txt"

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

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

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

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

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

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

ls !(*.txt)

Zsh:

ls *~*.txt

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

Один из способов использования find:

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