Bash ls(glob风格)

我有一个excersise,我必须打印当前文件夹中包含的所有文件名,其中包含至less1次(每个)的字母[ak][mp][1-9] 。 我可能必须使用ls (glob-style)

如果订单很重要,那么你可以使用globbing:

 $ ls *[ak]*[mp]*[1-9]* ajunk404 am1 cn5 

否则分别为每个组grep

 ls | grep "[ak]" | grep "[mp]" | grep "[1-9]" 1ma ajunk404 am1 cn5 m1a 

注意:如果你真的只想使用里面的文件, ls会显示目录:

 find . -maxdepth 1 -type f | grep "[ak]" | grep "[mp]" | grep "[1-9]" 

100%纯粹的bash(和搞笑!)的可能性:

 #!/bin/bash shopt -s nullglob a=( *[ak]* ) b=(); for i in "${a[@]}"; do [[ "$i" = *[pz]* ]] && b+=( "$i" ); done c=(); for i in "${b[@]}"; do [[ "$i" = *[1-9]* ]] && c+=( "$i" ); done printf "%s\n" "${c[@]}" 

没有任何外部过程! 没有管道! 只有纯粹的bash! 对于名字中带有滑稽符号的文件(例如换行符),100%是安全的(而使用ls其他方法则不是这种情况)。 如果你想真正看到文件名中有趣的符号,并正确引用它们,以便重用输出,请使用

 printf "%q\n" "${c[@]}" 

代替最后的printf语句。

注意。 模式[ak][pz]是与语言环境相关的。 您可能需要设置LC_ALL=C以确保[ak]确实意味着[abcdefghijk]而不是别的,例如[aAbBcCdDeEfFgGhHiIjJk]

希望这可以帮助!

如果顺序不重要,并且字母出现一次或多次,则可以使用链接的greps。

 ls | egrep "[ak]" | egrep "[mp]" | egrep "[1-9]" 

如果订单很重要,那么只需使用glob模式

 ls *[ak]*[mp]*[1-9]* 

要完成,你需要搜索所有的组合:

 ls *[ak]*[mp]*[1-9]* *[ak]*[1-9]*[mp]* \ *[mp]*[ak]*[1-9]* *[mp]*[1-9]*[ak]* \ *[1-9]*[mp]*[ak]* *[1-9]*[ak]*[mp]*