Фильтрация списка папок, полученных с помощью ls, с помощью выражения регулярного выражения - PullRequest
0 голосов
/ 21 марта 2019

Context

У меня есть команда ls, которая выдает мне список папок basename s следующим образом:

INPUT:
bash$ ls -d /nfs_archivedbuilds/build/mx/${VERSION_NAME}/${OPERATING_SYSTEM}/* | xargs -n1 basename

OUTPUT: 
4750070-190311-0913-3603182
4761979-190319-SHELVE-3617880
4763232-190319-2049-3618496
4763232-190320-SHELVE-3619115
4764259-190320-1402-3619606
4764259-190320-cifx-6274238
4764339-190320-2049-3620637
4764339-190320-SHELVE-3620115
4764339-190320-cifx-6274274

Эти папки упорядочены из самых старых (сначаларезультат) до самого нового (последний результат).

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

Для того, чтобы сделать это, я начинаю с получения tail -1:

SETUPS_CONTROL=1
MY_SETUP=$(ls -d /nfs_archivedbuilds/build/mx/${VERSION_NAME}/${OPERATING_SYSTEM}/* | xargs -n1 basename | tail -${SETUPS_CONTROL})
... doing some stuff to check

... и, если это окажется не очень хорошим, я увеличиваю SETUPS_CONTROL и получаюснова MY_SETUP, на этот раз с +1 хвостом.

Вопрос

Я бы хотел сохранить ту же логику, но с возможностью отфильтровывать уже в моей команде ls все папки, которые не сделаны изтолько числа.Например:

  • Папка 4750070-190311-0913-3603182 будет полезна для меня, потому что это только цифры и тире
  • Папка 4761979-190319-SHELVE-3617880 не будет полезной для меня, потому что она содержитслово (SHELVE), и оно состоит не только из цифр и тире.

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

if [[ ${MY_SETUP} =~ "^[0-9-]+$" ]] 
then
    #my setup might be good
else
    #my setup is not good already, no need to further my checks
fi

Это работает нормально, но мне было интересно, не смогу ли я отфильтровать список непосредственно в моей ls команде вместо того, чтобы что-то получить, и мне пришлось зацикливаться, чтобы понять, хорошо это или нет.

Моя попытка

Я пытался передать grep "my regex expression" в команду:

ls -d /nfs_archivedbuilds/build/mx/${VERSION_NAME}/${OPERATING_SYSTEM}/* | xargs -n1 basename | grep "^[0-9-]+$"

... но он возвращает пустой результат.То же самое с одинарной цитатой:

ls -d /nfs_archivedbuilds/build/mx/${VERSION_NAME}/${OPERATING_SYSTEM}/* | xargs -n1 basename | grep '^[0-9-]+$'

Кто-нибудь может помочь?

1 Ответ

1 голос
/ 21 марта 2019

Вы пропускаете -E во время выполнения grep с регулярным выражением, пожалуйста, добавьте grep -E

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...