【发布时间】:2010-04-15 08:57:39
【问题描述】:
我想从 shell (bash) 通配字符串 *.log 中排除特定的文件名(例如 fubar.log)。我尝试的任何方法似乎都不起作用,因为 globbing 不使用标准 RE 集。
测试用例:目录包含
fubar.log
fubaz.log
barbaz.log
text.txt
只有fubaz.log barbaz.log 必须由全局扩展。
【问题讨论】:
标签: shell
我想从 shell (bash) 通配字符串 *.log 中排除特定的文件名(例如 fubar.log)。我尝试的任何方法似乎都不起作用,因为 globbing 不使用标准 RE 集。
测试用例:目录包含
fubar.log
fubaz.log
barbaz.log
text.txt
只有fubaz.log barbaz.log 必须由全局扩展。
【问题讨论】:
标签: shell
如果你正在使用 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
【讨论】:
shopt -u extglob 不过我没有判断它的知识。
shopt -u extglob 关闭 extglob。但是,关闭 extglobs 并不能使 extglob 语法正常工作,因此(现在已接受?)编辑对我来说似乎很糟糕——这个答案的 shopt -s extglob 分支很好,case 也很好声明版本,但我对另一个深表怀疑。
为什么不使用 grep?例如:
ls |grep -v fubar|while 读取行;做 echo "reading $line";完成;
这是输出:
阅读 barbaz.log 阅读fubaz.log 阅读文本.txt
【讨论】:
ls。即使你没有 extglobs 可以做!(*fubar*),也可以少做一些类似的事情:for file in *; [[ $file = *fubar* ]] && continue; echo "Reading $line"; done