可以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.repo
,CentOS-Debuginfo.repo
但CentOS-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'