什么命令列出所有以“a”开头且后面有 1 或 2 位数字的文件? (输出可能显示 a0、a1、a2、a3、a00、a01、a99...,但不显示 a333、b12、art53,...)
答案1
在zsh
壳里,
setopt EXTENDED_GLOB
printf '%s\n' a[[:digit:]](#c1,2)(.)
该模式a[[:digit:]](#c1,2)(.)
将匹配名称以 开头并a
后跟一两个数字的任何常规文件。最后(.)
的确保我们只获取常规文件的名称,同时[[:digit:]](#c1,2)
匹配一两个数字。
在sh
或bash
等中,
printf '%s\n' a[[:digit:]] a[[:digit:]][[:digit:]]
这将列出所有以 an 开头a
,然后有一位或两位数字的名称(我们对一位数字的名称使用一种模式,对两位数字的名称使用另一种模式)。但不确定您是否只能获得常规文件的名称(您也可能获得目录等的名称),并且如果一个或另一个模式(或两者)不匹配任何name,模式将保持不展开状态(使用shopt -s nullglob
inbash
来删除不匹配的模式)。
要清除任何非常规文件,请使用循环:
for name in a[[:digit:]] a[[:digit:]][[:digit:]]; do
if [ -f "$name" ]; then
printf '%s\n' "$name"
fi
done
在这里,我们-f
对每个名称应用显式测试。本次测试将真的如果名称引用常规文件(或指向常规文件的符号链接)。如果测试是真的,我们打印名字。
答案2
一种更通用的解决方案,并且不依赖于您使用的 shell,可能类似于
Helios:t larry$ ls -1
a0
a10
a100
ax
axe
b4
Helios:t larry$ find . -mindepth 1 -maxdepth 1 -type f -regextype egrep -regex '\./a[[:digit:]]{,2}'
./a10
./a0
但这会产生一个额外的过程。