我想选择所有带有日志扩展名的文件,并且不要在其名称中包含“error”字样。 我试过这个但不起作用
for i in *.log | grep -vs "error"
答案 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
误解为以-
开头的文件名作为错误选项。
根据实施情况,-F
或fgrep
也可能会加快实施速度:
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"