2010-04-15 44 views
9

我想从shell(bash)通配字符串*.log中排除特定文件名(比如fubar.log)。没有什么我尝试似乎工作,因为globbing不使用标准RE集。从shell通配中排除特定文件名

测试情况:该目录包含

fubar.log 
fubaz.log 
barbaz.log 
text.txt 

只有fubaz.log barbaz.log必须由水珠扩大。

+0

可能重复时,模式匹配一个unix/linux的shell?](http://stackoverflow.com/questions/216995/how-can-i-use-inverse-or-negative-wildcards-when-pattern-matching-in-a-unix-linu)这是另一个非常接近的子集。 – 2014-10-19 13:33:12

回答

15

如果你使用bash

#!/bin/bash 
shopt -s extglob 
ls !(fubar).log 

或不extglob

shopt -u extglob 
for file in !(fubar).log 
do 
    echo "$file" 
done 

for file in *log 
do 
    case "$file" in 
    fubar*) continue;; 
    *) echo "do your stuff with $file";; 
    esac 
done 
+0

谢谢!你有没有extglob的解决方案? – Alsciende 2010-04-15 09:08:48

+2

被拒绝的编辑表明,在没有extglob的情况下需要这样做:'shopt -u extglob'我没有知识来判断它。 – 2013-10-25 10:09:37

3

你为什么不使用grep?例如:

ls | grep -v fubar | while read line;做回声“阅读$行”;完成;

这里是输出:

阅读barbaz.log 阅读fubaz.log 阅读[如何我可以使用逆或负通配符的text.txt

+1

因为glob字符串被赋予一个程序(logrotate)。所以我需要一个glob字符串。 – Alsciende 2010-04-15 09:38:44

相关问题