选择以 $LETTER 开头或字母表中晚于 $LETTER 的字母的文件

选择以 $LETTER 开头或字母表中晚于 $LETTER 的字母的文件

假设一个目录包含以下文件:

  • 文件1
  • 文件2
  • b文件
  • .c文件
  • 文件
  • 文件2
  • q文件
  • 兹文件

我正在寻找一种简单的方法来选择所有以 $LETTER 开头的文件,或者以字母表中晚于 $LETTER 的字母开头的文件。可以轻松修改以查找以 $LETTER 开头的文件或以字母开头的文件的解决方案早些时候比字母表中的 $LETTER 有用。

例如,在上面的列表中,LETTER=c,我想选择“cfile,ffile,ffile2,qfile,zfile”

上面是一个简化的例子。在现实世界中,该目录将包含数千个文件。最后我使用了ls | tail -n${FUDGE_FACTOR}手动发现软糖因子的方法,但我正在寻找一种自动执行此操作的方法。

我正在寻找一个基于 shell 的解决方案(我使用 BASH,但欢迎使用其他 shell 中的解决方案)。我知道 shell 脚本可能不是完成此任务的最佳工具,但我提出这个问题纯粹是出于兴趣(了解有关 shell 脚本的更多信息),所以请不要在 python/perl/lua/$ 中回复答案FAVE_SCRIPTING_LANGUAGE

关于 shell 脚本对于此类任务的限制的一般评论,以及在现实中解决这些限制的最佳方法(即没有我的“必须是基于 shell 的解决方案”规定),将是最受欢迎的。

谢谢

答案1

其实很简单:

echo [$LETTER-z]*

如果您想要区分大小写:

echo [$(echo "$LETTER" | tr a-z A-Z)-Z$LETTER-z]*

这是有效的,因为 shell 执行参数扩展路径名扩展(即通配符)。

答案2

使用 shell 的内置通配符怎么样?

LETTER=c; echo [$LETTER-z]*

这对我来说在 bash 和 ksh 中有效。

答案3

您可以使用这样的脚本:

START=c
END=q
ls | egrep ^[$START-$END].*

这将选择以 c 到 q 开头的所有文件。

示例输出:

[gbeech@svr01 test]$ echo  ^[$START-$END].*
^[c-q].*
[gbeech@svr01 test]$ ls | egrep ^[$START-$END].*
cfile
ffile
ffile2
qfile

它也可以扩展以限制 grep,几乎可以通过调整正则表达式来执行任何操作。

相关内容