如何使用bash在其他目录中选择特定文件?


13

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

$ 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-inging到目录)?

Answers:



3

在bash下,运行shopt -s extglob(或将其放在中~/.bashrc),然后可以使用其他模式,这些模式提供具有不寻常语法的正则表达式(从ksh继承)。当然,您也可以在ksh以及zsh之后的zsh中使用这些模式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)是迄今为止最简单的方法。


如果仔细观察,您会发现我在问题中指定了“不首先将cd-ing到目录中”;)
neu242 2011年

1

您可以使用进行过滤egrep

ls | egrep '(aa|bb|cc)'

查找所有文本文件:

ls | egrep '(aa|bb|cc).txt'

1
点将匹配每个字符,并且这种方法使对这些文件进行进一步操作变得困难
enzotib 2011年

1
我也觉得ls只是一个示例命令。
2011年

是的,您是对的,我指定了要执行的操作:列出文件只是一个示例。
neu242 2011年

好的评论,亲爱的朋友,谢谢。祝你好运neu242:D-
海洋

1

首先,我向您介绍:从不解析LS永远。正确和规范的方式来执行您想要的操作是使用find

例如:

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

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


我从来没有说过要解析ls,而Rush的回答更好。不过,感谢您的尝试:)
neu242
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.