我想计算与深度为 1 的模式匹配的文件数量,并将其与数字进行比较,例如,看看是否有 3 个或更多这样的文件。但是,我想在不使用 if/then 语法的情况下执行此操作。
即像这样:
ls -1q -d *patternX* | wc -l | [ -ge 3]
Run Code Online (Sandbox Code Playgroud)
如果有人能让我知道是否有办法使用 if/then 语法来逃避,我将非常感激。谢谢!
您似乎想要计算匹配的名称数量*patternX*,然后测试它是否大于或等于三。
最好这样做:
shopt -s nullglob
set -- *patternX*
if [ "$#" -ge 3 ]; then
echo 'More than 2 names match the pattern'
fi
Run Code Online (Sandbox Code Playgroud)
这是将位置参数设置为与模式匹配的名称。匹配名称的数量将保存在 中$#。设置该nullglob选项的目的是,如果没有名称匹配,则模式将被完全删除而不是保持未展开状态。
您还可以使用命名数组来存储匹配的名称:
shopt -s nullglob
names=(*patternX*)
if [ "${#names[@]}" -ge 3 ]; then
echo 'More than 2 names match the pattern'
fi
Run Code Online (Sandbox Code Playgroud)
没有单词ifand then:
shopt -s nullglob
set -- *patternX*
[ "$#" -ge 3 ] && echo 'More than 2 names match the pattern'
Run Code Online (Sandbox Code Playgroud)
类似的方法使用awk:
shopt -s nullglob
awk 'BEGIN { if (ARGC > 3) print "more than 2" }' *patternX*
Run Code Online (Sandbox Code Playgroud)
请注意,ARGCinawk还表示命令名称($0shell 中的名称)。