假设一个目录包含以下文件:
- 文件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
答案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,几乎可以通过调整正则表达式来执行任何操作。