Отрицаемое набор символов в подстановку оболочки использует !
не ^
:
ls -d run*[!.]
(^
был в свое время архаичный синоним |
.) Опция -d
перечисляет имена каталогов, а не содержимое этих каталогов.
Попытка использования:
ls run* | grep '.*\d+'
требует PCRE с поддержкой grep
и параметр PCRE регулярное выражение (-P
), и вы ищете ноль или более любых символов следует одна или более цифр , это не то, что вы сказали, что хотите.Вы можете использовать:
ls -d run* | grep '[^.]$'
, который не требует регулярных выражений PCRE, но просто с оболочкой шарика правильных имен, вероятно, лучше.
Если вы беспокоитесь, что не может быть именем, начинающимся run
и заканчивая чем-то другим, чем точка, вы должны рассмотреть shopt -s nullglob
, как указано в Anubhava «s answer. Однако обратите внимание на приведенное ниже обсуждение между hek2mgl и мной о потенциально запутанном поведении, в частности, команды ls
в сочетании с shopt -s nullglob
. Если вы использовали:
for name in run*[!.]
do
…
done
shopt -s nullglob
совершенен; цикл повторяет нулевые времена, когда совпадение не выполняется для выражения glob. Это не так хорошо, когда выражение glob является аргументом для таких команд, как ls
, которые обеспечивают поведение по умолчанию в отсутствие аргументов командной строки.
Я не уверен, что ваше регулярное выражение будет делать то, что вы хотите, поэтому вы можете дважды проверить его, но ваша непосредственная проблема заключается в том, что вы должны передать опцию '-d' в' ls'. В противном случае он отобразит содержимое каталогов, а не сами каталоги. –