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

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

可以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\)]

但我收到错误信息,我该怎么办?

答案1

一些 shell 具有否定通配符:

  • zsh -o extendedglob

    ls -d -- ^*Media*
    ls -d -- *.repo~*Media* # ~ is "except" operator
    
  • ksh, zsh -o kshglob, bash -O extglob:

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

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

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

答案2

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

ls CentOS-[BDV]*

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

或与相同否定

ls CentOS-[^M]*

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

ls -I '*M*'

-我,--忽略=图案
不列出与 shell 匹配的隐含条目图案

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

ls -I '*Media*'

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

答案3

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

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

这里“f”表示搜索常规文件仅(但不包括常规文件的符号链接;对于 GNU find,请使用-xtype f来包含它们)。如果您想搜索目录,请传递“d”。

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

看到查找手册页了解更多精彩功能。

答案4

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

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

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

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

相关内容