使用bash ls命令仅根据文件的中间部分列出文件

时间:2019-07-19 13:41:22

标签: bash shell sh

我是bash的新手,对bash有一个非常基本的问题。 我有类似的文件:

a_lsst_z1.5_000.txt
a_lsst_z1.5_001.txt
a_lsst90_z1.5_001.txt
a_lsst_mono_z1.5_000.txt
a_lsst_mono_z1.5_001.txt
a_lsst_mono90_z1.5_000.txt
a_lsst_mono90_z1.5_001.txt
and so on

我只想列出没有lsst的文件(lsst90lsst_mono  或lsst_mono90

我尝试过:

ls a_lsst_*.txt # but it gives all files

必填输出:

a_lsst_z1.5_000.txt
a_lsst_z1.5_001.txt

如何仅获取 lsst 文件?

4 个答案:

答案 0 :(得分:3)

也许只是将_之后的第一个字符匹配为数字?

echo a_lsst_[0-9]*.txt

编辑后,您只需匹配z1.5部分:

echo a_lsst_z1.5_*.txt

答案 1 :(得分:1)

如果您想使用ls并排除某些字符,可以尝试:

ls a_lsst[^9m]*.txt

这将排除lsst90和lsst_mono等文件。

答案 2 :(得分:1)

尝试

ls -ltr a_lsst_z1.5_*.txt

答案 3 :(得分:0)

find . -iname "a_lsst_*.txt" -type f -printf %P\\n 2>/dev/null

给出:

a_lsst_mono90_z1.5_001.txt
a_lsst_z1.5_000.txt
a_lsst_z1.5_001.txt
a_lsst_mono_z1.5_000.txt
a_lsst_mono_z1.5_001.txt
a_lsst_mono90_z1.5_000.txt

find . -iname "a_lsst_z1*.txt" -type f -printf %P\\n 2>/dev/null

给出:

a_lsst_z1.5_000.txt
a_lsst_z1.5_001.txt

在当前目录 find 中使用 . 命令并使用 -iname 在使用模式 a_lsst_*.txta_lsst_z1*.txt 时您将获得预期结果。

使用 -type f 只匹配文件(不是目录)。

使用 -printf%P 获取开头没有 ./ 的路径,使用 \\n 以换行符结尾。

2>/dev/null 防止在使用 Permission denied 命令时显示任何错误,包括非常常见的 find