Перечислите все файлы, не соответствующие шаблону, с помощью ls [duplicate]

Возможный дубликат:
Как использовать обратные или отрицательные подстановочные знаки при сопоставлении с образцом в оболочке 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] 

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

Любая помощь приветствуется!

РЕДАКТИРОВАТЬ:

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


person Kaushik Shankar    schedule 28.09.2012    source источник
comment
stackoverflow.com/q/8525437/608639   -  person jww    schedule 22.08.2018


Ответы (5)


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

find ./ -maxdepth 1 ! -path "*txt"
person Robert Guo    schedule 28.09.2012
comment
Это прекрасно работает со многими различными селекторами в качестве параметра path. Спасибо! Я обнаружил, что тоже умею find . -maxdepth 1 ! -path "*txt". Что бы мне пришлось использовать, если бы у меня было Regex для фильтрации списка? - person Kaushik Shankar; 28.09.2012
comment
если вы хотите использовать Regex, используйте grep. бывший . у вас есть 3 файла, например a b c, используйте ls | grep -v [a | b], тогда он отобразит c. а затем, если у вас есть 3 файла a aa aaa, используйте ls | grep -v a +, тогда будет отображаться только файл. - person Robert Guo; 28.09.2012
comment
./ Аргумент не является обязательным, так как команда find уже начала поиск вниз из текущего дерева каталогов - person kante; 24.05.2013
comment
Ответ Мани Р. - правильный ответ на исходный вопрос. - person karatedog; 17.10.2019

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

ls --ignore=*.txt

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

person Manikandan Rajendran    schedule 29.09.2012
comment
Этот мне понравился. Вы можете связать переключатели --ignore вместе и, таким образом, игнорировать, например, все файлы txt, все файлы, начинающиеся с j, и все файлы с именем, содержащим 'bar': ls --ignore=*.txt --ignore=j* --ignore=*bar* - person Gert Sønderby; 21.05.2013
comment
Я получаю недопустимый параметр, когда использую его в El Capitan ls --ignore = * pdf ls: незаконный параметр - - использование: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [файл ...] - person Adil Hindistan; 11.09.2016
comment
Спасибо. На самом деле это должен быть принятый ответ !! - person Veera; 17.01.2017

ls|grep -v ".txt"

это помогает?

person nav_jan    schedule 28.09.2012
comment
Это работает для случая, который я вам дал, но на самом деле я ищу что-то, что работает с любыми селекторами. Например, если я хочу не показывать те, у которых есть символ x, за которым следует слово in, мне нужно использовать селектор *x*in*. Думаю, на вашем примере это было бы невозможно. - person Kaushik Shankar; 28.09.2012
comment
@KaushikShankar Думаю, сработает. Попробуйте. - person nav_jan; 28.09.2012

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.

person Thor    schedule 28.09.2012
comment
Спасибо, что показали мне еще одну функцию zsh! Это круто. - person Kaushik Shankar; 28.09.2012

В одну сторону с использованием find:

find . -maxdepth 1 -type f -not -name "*.txt" -printf "%f\n"
person Steve    schedule 28.09.2012
comment
Благодарю за ваш ответ! К сожалению, я думаю, что может возникнуть проблема с запуском в Mac OS X. Я получаю следующую ошибку: Команда: >find . -maxdepth 1 -type f -not -name "*.txt" -printf "%f\n" Ошибка: 39m\n"find: -printf: unknown primary or operator - person Kaushik Shankar; 28.09.2012
comment
@KaushikShankar: Да, не обращайте внимания на инструкцию printf, она только очистит ваш вывод и предоставит список файлов, аналогичный тому, как будет работать ls. Кажется, BSD find этого не понимает. - person Steve; 28.09.2012