如何查找除指定文件外的所有文件


13

ls可以给像结果

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls

CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo

但实际上我希望只是看看CentOS-Base.repoCentOS-Debuginfo.repoCentOS-Vault.repo却没有CentOS-Media.repo。所以我运行这个命令

ls [^\(Media\)]

但是我得到一个错误信息,该怎么办?



@steeldriver感谢您的链接,这对我非常有用
。.– yode

您可以考虑将您的shell切换到zsh,它具有模式删除功能
Basile Starynkevitch

Answers:


10

在最简单的情况下,您可以使用以下内容(如果第一个子字为static CentOS):

ls CentOS-[BDV]*

  • [BDV] -字符类,以确保第二个子字以指定字符之一开头

或与否定相同:

ls CentOS-[^M]*

如果要M使用GNU实现ls(通常在CentOS上找到)来忽略所有包含该字符的文件名,请使用-I--ignore)选项:

ls -I '*M*'

-I,-ignore = PATTERN
不列出与shell PATTERN匹配的隐式条目

要忽略带有Media单词的条目:

ls -I '*Media*'

这些模式需要逐字传递给ls,因此必须加引号(否则,shell会将它们视为要扩展的glob)。


为什么我们不能使用ls *[^M]*
yode

ls CentOS-[^M]*工作中,但ls *[^M]*不..
yode

@yode,取决于您究竟要忽略什么:M字符出现还是Media单词?
RomanPerekhrest

但就我而言,只有那个文件有一个字符M
yode

3
模式是贪婪的:第一个*匹配除最后一个字母以外的所有内容,[^ M]匹配最后一个字母,因为它们都不以M结尾,尾随*匹配空字符串。所以他们都匹配。并且即使某些内容以M结尾,如果在某处与M有所不同,它仍然会匹配:例如,如果您有一个名为OOM的文件,则第一颗星将与第一个O匹配,[^ M]将与第二个O匹配并且后开始将匹配M.
NickD

12

一些外壳具有否定全局操作符:

  • zsh -o extendedglob

    ls -d -- ^*Media*
    ls -d -- *.repo~*Media* # ~ is "except" operator
    
  • kshzsh -o kshglobbash -O extglob

    ls -d -- !(*Media*)
    
  • bash

    GLOBIGNORE='*Media*'
    ls -d -- *
    
  • ksh

    FIGNORE='@(*Media|.)*'
    ls -d -- *
    

6

一种选择是find-not -name 标志一起使用。即find . -not -name CentOS-Media.repo。如果您不想递归目录结构,请添加-maxdepth 1标志。

或者,可以编写以下内容(这要复杂得多,但我忘记了-notflag并最初发布了此答案,因此我不会删除此部分):

find . -print0 | grep --invert-match -z "CentOS-Media.repo$" | tr '\0' '\n'

您需要强制find使用空字节分隔文件名,以便文件名中的换行符不会分解任何内容。希望grep用flag支持这种分隔符-z。您可能需要恢复为典型的分隔符(即,空字节->新行),tr '\0' '\n'


1
您还可以获取以null分隔的文件名,printf '%s\0' *这些文件名默认情况下不会递归并且不包含点文件(但某些Shell对此有一个选项)。您还没有需要做-E正则表达式,但要挑剔的您应该加上反斜杠.或把它放在[]和你做依靠GNU find和grep。
dave_thompson_085

4

最简单的方法是使用查找。做:

find . -maxdepth 1 -type f ! -name "CentOS-Media.repo"

此处的“ f”表示仅搜索常规文件(尽管不包括指向常规文件的符号链接;对于GNU find-xtype f则改为包括它们)。如果要搜索目录,请改为传递“ d”。

-maxdepth虽然起初GNU扩展现在很普遍。如果您find不支持它,则可以-maxdepth 1用标准替换! -name . -prune)。

请参阅查找手册页,以获取更多很棒的功能。

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.