Bash ls(glob-style)

时间:2012-12-28 11:32:39

标签: linux bash unix ls

我有一个例外情况,我必须打印当前文件夹中包含的所有文件名,其中包含一个字母[a-k][m-p]以及{{1}至少1次(每次)。 我可能不得不使用[1-9] (glob-style)

4 个答案:

答案 0 :(得分:3)

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

$ ls *[a-k]*[m-p]*[1-9]*
ajunk404  am1  cn5

另外,每个组只有grep

ls | grep "[a-k]" | grep "[m-p]" | grep "[1-9]"
1ma
ajunk404
am1
cn5
m1a

注意:ls如果您真的只希望文件在find内使用,则会显示目录:

find . -maxdepth 1 -type f | grep "[a-k]" | grep "[m-p]" | grep "[1-9]"

答案 1 :(得分:1)

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

#!/bin/bash

shopt -s nullglob
a=( *[a-k]* )
b=(); for i in "${a[@]}"; do [[ "$i" = *[p-z]* ]] && 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声明。

注意。模式[a-k][p-z]与语言环境有关。您可能需要设置LC_ALL=C以确保[a-k]真正意味着[abcdefghijk]而不是其他内容,例如[aAbBcCdDeEfFgGhHiIjJk]

希望这有帮助!

答案 2 :(得分:0)

如果订单不重要,并且字母出现一次或多次,则可以使用链式greps。

ls | egrep "[a-k]" | egrep "[m-p]" | egrep "[1-9]"

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

ls *[a-k]*[m-p]*[1-9]*

答案 3 :(得分:0)

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

ls *[a-k]*[m-p]*[1-9]* *[a-k]*[1-9]*[m-p]* \
   *[m-p]*[a-k]*[1-9]* *[m-p]*[1-9]*[a-k]* \
   *[1-9]*[m-p]*[a-k]* *[1-9]*[a-k]*[m-p]*