使用正则表达式过滤通过ls获得的文件夹列表

时间:2019-03-21 09:42:01

标签: regex bash

上下文

我有一个ls命令,该命令为我提供了文件夹basename的列表,如下所示:

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 个答案:

答案 0 :(得分:1)

使用正则表达式执行grep时,您缺少-E,请添加grep -E