【问题标题】:Exclude specific filename from shell globbing从 shell globbing 中排除特定文件名
【发布时间】: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


【解决方案1】:

如果你正在使用 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

【讨论】:

  • 谢谢!你有没有 extglob 的解决方案吗?
  • 被拒绝的编辑表明在没有 extglob 的情况下需要这样做:shopt -u extglob 不过我没有判断它的知识。
  • shopt -u extglob 关闭 extglob。但是,关闭 extglobs 并不能使 extglob 语法正常工作,因此(现在已接受?)编辑对我来说似乎很糟糕——这个答案的 shopt -s extglob 分支很好,case 也很好声明版本,但我对另一个深表怀疑。
【解决方案2】:

为什么不使用 grep?例如:

ls |grep -v fubar|while 读取行;做 echo "reading $line";完成;

这是输出:

阅读 barbaz.log 阅读fubaz.log 阅读文本.txt

【讨论】:

  • 因为将 glob 字符串提供给程序 (logrotate)。所以我需要一个 glob 字符串。
  • Why you shouldn't parse the output of ls。即使你没有 extglobs 可以做!(*fubar*),也可以少做一些类似的事情:for file in *; [[ $file = *fubar* ]] && continue; echo "Reading $line"; done
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多