我想列出(或删除,或执行某些其他操作)目录中的某些文件,如下所示:
$ ls /opt/somedir/
aa bb cc aa.txt bb.txt cc.txt
$ ls /opt/somedir/(aa|bb|cc) ## pseudo-bash :p
aa bb cc
我怎样才能实现这一点(无需先 cd-ing 到目录)?
答案1
答案2
在 bash 下,运行shopt -s extglob
(或将其放入您的~/.bashrc
),您可以使用其他图案提供具有不寻常语法的正则表达式(继承自 ksh)。当然,您也可以在 ksh 中使用这些模式,也可以在 zsh after 中使用这些模式setopt ksh_glob
。
$ shopt -s extglob
$ ls /opt/somedir/@(aa|bb|cc|doesnotexist)
/opt/somedir/aa /opt/somedir/bb /opt/somedir/cc
在zsh中,可以直接(foo|bar)
作为模式使用。
% ls /opt/somedir/(aa|bb|cc|doesnotexist)
/opt/somedir/aa /opt/somedir/bb /opt/somedir/cc
请注意,该命令是使用完整路径调用的。如果您想使用短路径调用命令,则需要以某种方式更改目录,这(cd /opt/somedir && somecommand aa bb cc)
是迄今为止最简单的方法。
答案3
您可以使用以下方式进行过滤egrep
:
ls | egrep '(aa|bb|cc)'
要查找所有文本文件:
ls | egrep '(aa|bb|cc).txt'