Соответствие имени файла в 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: -)