如何使用 bash 选择不同目录中的特定文件?

如何使用 bash 选择不同目录中的特定文件?

我想列出(或删除,或执行某些其他操作)目录中的某些文件,如下所示:

$ 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

使用花括号:

ls /opt/somedir/{aa,bb,cc}

欲了解更多信息,请阅读大括号扩展

答案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'

答案4

首先,我引导您:从不解析 ls,曾经。做你想做的事情的正确和规范的方法是寻找

例如:

find /opt/somedir -regex '.*[aa|bb|cc].*' -exec mv '{}' ~/backup \;

我通常使用-name代替,-regex因为它更简单。但正则表达式适合您的用例。你应该运行命令没有 -exec第一次,以确保它们确实是您想要移动/删除的文件。

相关内容