2

我在这里搜索过,但仍然找不到我的通配问题的答案。

我们有文件“file.1”到“file.5”,如果我们的通宵处理正常,每个文件都应该包含字符串“completed”。

我认为首先检查是否有一些文件是一件好事,然后我想对它们进行 grep 以查看是否找到 5 个“已完成”字符串。以下无辜的方法不起作用:

FILES="/mydir/file.*"
if [ -f "$FILES" ]; then
    COUNT=`grep completed $FILES`
    if [ $COUNT -eq 5 ]; then
        echo "found 5"
else
    echo "no files?"
fi

谢谢你的建议……莱尔

4

3 回答 3

3

根据http://mywiki.wooledge.org/BashFAQ/004,计算文件的最佳方法是使用数组(带有nullglob选项集):

shopt -s nullglob
files=( /mydir/files.* )
count=${#files[@]}

如果你想收集这些文件的名称,你可以这样做(假设 GNU grep):

completed_files=()
while IFS='' read -r -d '' filename; do
  completed_files+=( "$filename" )
done < <(grep -l -Z completed /dev/null files.*)
(( ${#completed_files[@]} == 5 )) && echo "Exactly 5 files completed"

这种方法有些冗长,但即使是非常不寻常的文件名也能保证工作。

于 2013-05-14T00:19:02.150 回答
2

尝试这个:

[[ $(grep -l 'completed' /mydir/file.* | grep -c .) == 5 ]] || echo "Something is wrong"

如果找不到 5completed行,将打印“Something is wrong”。

更正了缺失的“-l”——解释

$ grep -c completed file.*
file.1:1
file.2:1
file.3:0

$ grep -l completed file.* 
file.1
file.2

$ grep -l completed file.* | grep -c .
2

$ grep -l completed file.* | wc -l
   2
于 2013-05-14T00:22:24.327 回答
0

您可以这样做以防止出现通配现象:

echo \'$FILES\'

但似乎你有一个不同的问题

于 2013-05-14T00:19:20.277 回答