我想计算与深度为 1 的模式匹配的文件数量,并将其与数字进行比较,例如,看看是否有 3 个或更多这样的文件。但是,我想在不使用 if/then 语法的情况下执行此操作。
即像这样:
ls -1q -d *patternX* | wc -l | [ -ge 3]
如果有人能让我知道是否有办法使用 if/then 语法来逃避,我将非常感激。谢谢!
答案1
您似乎想要计算匹配的名称数量*patternX*
,然后测试它是否大于或等于三。
最好这样做:
shopt -s nullglob
set -- *patternX*
if [ "$#" -ge 3 ]; then
echo 'More than 2 names match the pattern'
fi
这是将位置参数设置为与模式匹配的名称。匹配名称的数量将保存在 中$#
。设置该nullglob
选项的目的是,如果没有名称匹配,则模式将被完全删除而不是保持未展开状态。
您还可以使用命名数组来存储匹配的名称:
shopt -s nullglob
names=(*patternX*)
if [ "${#names[@]}" -ge 3 ]; then
echo 'More than 2 names match the pattern'
fi
没有单词if
and then
:
shopt -s nullglob
set -- *patternX*
[ "$#" -ge 3 ] && echo 'More than 2 names match the pattern'
类似的方法使用awk
:
shopt -s nullglob
awk 'BEGIN { if (ARGC > 3) print "more than 2" }' *patternX*
请注意,ARGC
inawk
还表示命令名称($0
shell 中的名称)。
答案2
对于zsh
,您通常会使用匿名函数,例如:
()(( $# >= 3 )) *patternX*(N)
它调用一个匿名函数,其主体是(( $# >= 3 ))
(返回真的如果参数数量为 3 或更多),则以*patternX*(N)
glob 的扩展作为参数。
(N)
是启用nullglob
该 glob 的选项,以便 glob 扩展为空,而不是在没有匹配文件时报告错误。
对于您所问的问题,更直接的答案可能是:
ls -1q -d -- *patternX* | wc -l | xargs -IN test N -ge 3
(在任何 shell 中,但请注意,当模式与任何文件都不匹配时,不同 shell 的行为会有所不同)。
或者:
[ "$(( $(ls -1q -d -- *patternX* | wc -l) ))" -ge 3 ]
(在任何 POSIX 或类似 Korn 的 shell 中)
答案3
我很难相信这是一个现实世界的问题,但这里有一个解决方案:
ls -1q -d *patternX* | wc -l | egrep '^[3-9][0-9]*|[0-9][0-9]+' && echo JA