循环遍历所有文件,除了包含"错误"

时间:2014-08-14 08:59:25

标签: bash

我想选择所有带有日志扩展名的文件,并且不要在其名称中包含“error”字样。 我试过这个但不起作用

for i in *.log | grep -vs "error"

4 个答案:

答案 0 :(得分:3)

您可以使用extglob option作为

shopt -s extglob; for f in !(*error*).log; do echo "$f"; done; shopt -u extglob;

extglob

  

如果使用内置的shopt启用了extglob shell选项,   几个扩展模式匹配运算符被识别。在里面   在下面的描述中,模式列表是一个或多个的列表   由|分隔的模式。可以使用形成复合图案   一个或多个以下子模式:

     
      
  • ?(模式列表)      匹配给定模式的零次或一次
  •   
  • *(模式列表)      匹配给定模式的零次或多次出现
  •   
  • +(模式列表)      匹配给定模式的一次或多次出现
  •   
  • @(模式列表)      匹配给定模式之一
  •   
  • !(模式列表)      匹配除了给定模式之外的任何内容
  •   

测试

使用extglob

shopt -s extglob; for f in !(*error*).log; do echo "$f"; done; shopt -u extglob;
  

alternatives.log auth.log dpkg.log ...

没有extglob

for f in *.log; do echo "$f"; done
  

alternatives.log auth.log boot.log bootstrap.log dpkg.log ...

答案 1 :(得分:2)

如果你正在循环,请提前退出循环以获取你不想要的循环。

for i in *.log; do
    case $i in *error* ) continue ;; esac
    :  loop
done

extglob解决方案不同,即使是古老的Bourne shell也是如此。

答案 2 :(得分:1)

我可能回答错了。使用extglob是更好的解决方案。但这是另一种方式:

printf '%s\n' *.log | grep -v error

上一个回答:

无需使用for循环。您可以一次传递所有文件:

grep -vsl error -- *.log

--是一个可选的option-file-argument分隔符,可以防止grep误解为以-开头的文件名作为错误选项。

根据实施情况,-Ffgrep也可能会加快实施速度:

grep -Fvsl error -- *.log

答案 3 :(得分:0)

例如,在下面的脚本命令file中,您可以将其更改为您需要的任何命令。该脚本也适用于名称中包含空格的文件。

OIFS="$IFS"
IFS=$'\n'

for f in *.log 
do 
if [ -n "$(echo $f  | grep -v error)" ] ; then file $f ;
 fi
done 

IFS="$OIFS"