Соответствие имени файла в ls (bash)

У меня есть следующие файлы

tcpdump-12
tcpdump-12.delay
tcpdump-24
tcpdump-24.delay

Есть ли способ ls только файлы

tcpdump-12
tcpdump-24

Я могу сделать

ls tcpdump-[[:digit:]][[:digit:]]

но я ищу что-то более общее, которое может принимать любое количество цифр, например tcpdump- [0-9] +, если я использовал регулярные выражения vim или python.

Ответ 1

Нужно включить расширенную глобальную функциональность bash, чтобы иметь возможность использовать расширенное сопоставление с образцом.

$ ls
tcpdump-12  tcpdump-12.delay  tcpdump-24  tcpdump-24.delay
$ shopt -s extglob
$ ls tcpdump-+([[:digit:]])
tcpdump-12  tcpdump-24

Ответ 2

Если вы уверены, что все нежелательные файлы заканчиваются на ".delay", вы можете сделать это:

ls --ignore '*.delay'

код >

Ответ 3

Я не уверен, почему вы используете [[:digit:]], а не [0-9]; вы согласованы, имена файлов могут содержать другие типы цифр?

Большинство других ответов хороши, но быстрое и грязное решение:

ls tcpdump-*[0-9]

Он работает для определенного набора файлов, которые у вас есть, но он также будет соответствовать именам файлов, например tcpdump-FOO7.

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

Ответ 4

Вы можете вывести вывод из ls в grep. У Grep есть опция "инвертировать" (чтобы показать строки, которые не совпадают), поэтому вы можете сделать это:

 ls tcpdump-* | grep -v '\.delay$'

Ответ 5

Если вы не пропустите их через внешний фильтр, вы можете использовать:

ls -1 tcpdump-* | grep '^tcpdump-[0-9]*$'

Просто имейте в виду, что это дает вам по одной строке, а не приятный вывод с несколькими столбцами ls.

Если вы обрабатываете этот список, это не имеет большого значения, но если вы просто хотите увидеть эти файлы в списке каталогов, это не очень хорошо. Я предполагаю, что первый из них, иначе, этот вопрос действительно не принадлежит SO: -)