Перечислите все файлы, которые не соответствуют селектору (с помощью 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
, но я все еще застреваю в понимании того, как писать регулярные выражения. Я хорошо понимаю концепцию регулярных выражений, но я путаюсь между регулярными выражениями, которые используют другой синтаксис.
Любая помощь была бы очень признательна!
Редактировать:
Я забыл упомянуть, что я использую Mac OS X, поэтому функции могут немного отличаться от тех, которые обсуждались в других ответах для оболочки unix / linux (отсюда и некоторая моя путаница с sed
,awk
,и grep
).
5 ответов:
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.