2016-02-25 4 views
0

У меня есть два каталога:Ls и регулярное выражение линукс

  1. run.2016-02-25_01.
  2. run.2016-02-25_01.47.04

Обе эти каталоги присутствуют под общим названием каталога gte.

Я хочу каталог, который заканчивается без символа точки ..

Я использую следующую команду, однако, я не могу заставить его работать:

ls run* | grep '.*\d+' 

команды не в состоянии найти что-нибудь.

+1

Я не уверен, что ваше регулярное выражение будет делать то, что вы хотите, поэтому вы можете дважды проверить его, но ваша непосредственная проблема заключается в том, что вы должны передать опцию '-d' в' ls'. В противном случае он отобразит содержимое каталогов, а не сами каталоги. –

ответ

3

Отрицаемое набор символов в подстановку оболочки использует ! не ^:

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, которые обеспечивают поведение по умолчанию в отсутствие аргументов командной строки.

+0

Указанный выше шар не работает для меня. – hek2mgl

+0

@ hek2mgl: Действительно? Это работает для меня с Bash 3.2. '> Xx1; > Xx2; > Хх .; ls xx [!.] 'перечисляет только' xx1' и 'xx2' (если не было других трехсимвольных файлов, начинающихся с' xx' в каталоге). Также в оболочке Korn. –

+0

Спасибо! Именно то, что я искал :) –

0

Это работает ...

ls|grep '.*[^.]$' 

То есть сказать, что я хочу, любое количество чего-либо, но я хочу, последний символ перед окончанием строки должны быть ничего за исключением периода.

1

Не требуется grep. Просто используйте:

shopt -s nullglob 
ls -d run*[0-9] 

Если ваши каталоги не всегда заканчивается с цифрами используйте extglob:

shopt -s nullglob extglob 
ls -d run*+([^.]) 

или перечислить все записи внутри run* каталога, заканчивающегося без DOT:

printf "%s\n" run*+([^.])/* 
+1

OP хочет папки * без * точки – hek2mgl

+0

Да, извините, я интерпретировал противоположное. Сейчас исправлено – anubhava

+1

Ок. Предполагаемый параметр 'shopt -s nullglob' должен быть установлен, так как если такой папки нет, текущий код даст вам (буквально)' run * [0-9]/* ' – hek2mgl

0

Я бы использовал find

find -regextype posix-awk -maxdepth 1 -type d -regex '-*[[:digit:]]+$' 
0

Чтобы просмотреть каталоги, которые не заканчиваются ..

ls -d run* |grep "[^.]$"

+1

Не нужно избегать периода со слэшем, поскольку период не имеет особого значения внутри квадратных скобок. – Copas

+0

Вы правы, спасибо. – slugo