ls | grep regex,忽略带有 .tab 的文件,

ls | grep regex,忽略带有 .tab 的文件,

我知道一些正则表达式,但我不知道如何让它工作。我想列出所有没有 .tab 的文件。文件名末尾没有 ~ 并且不是 .o(或 .bin)

我可以列出所有带有 .tab 的文件,方法是:

ls | grep .tab.

但是我不知道如何让它忽略这些文件并列出其他文件。我试过了

ls | grep [^(.tab.)]

但出现了错误,我以为我的最终正则表达式应该是

ls | grep ([^(.tab.)]|.o$|.bin$)

但是我从来没有做过太多的正则表达式,所以我确信即使语法正确,最终的结果也是错误的。

答案1

我如何执行此操作取决于上下文。如果这不是脚本,而我只是想看看这个,我可以使用 ls:

ls -a | egrep -v '(tab|\.o$|\.bin$|~$)'

如果在脚本中,我会使用循环:

for file in *; do
#file $file in .* *; do   -- To Include dot (hidden files)                     
   if ! egrep -q '(tab|\.o$|\.bin$|~$)' <<<$file; then
      echo $file
   fi
done

如果您只想要常规文件而不是目录,则可以添加另一个带有 -f 的 if 测试。如果您想以递归方式执行此操作,可以使用带有 -regex 测试和 posix-egrep 的 GNU find。但请考虑到此正则表达式将匹配相对于您搜索的目录的完整路径名。

另一个不错的选择是扩展 glob(如果您有支持的话),请参阅 Dennis 的回答。

答案2

-v/选项--invert-match使 grep 输出以下行:不是匹配。所以:

ls | grep -v .tab.

或者

ls | grep --invert-match .tab.

就你的情况而言。

答案3

shopt -s extglob
ls -l !(*.bin|*.o|*~|*.tab.*)

答案4

ls | egrep -v (.tab|.o$|.bin$)

应该可以。egrep 基本上是 grep -E,它支持“扩展”正则表达式,因此像 (x|y) 这样的功能可以工作。

相关内容