关键词:
【中文标题】列出与模式不匹配的文件?【英文标题】:List files not matching a pattern? 【发布时间】:2012-01-21 11:08:57 【问题描述】:以下是如何列出与 bash 中的模式匹配的所有文件:
ls *.jar
如何列出模式的补码?即所有不匹配 *.jar 的文件?
【问题讨论】:
这可能不应该被标记为正则表达式,* 是一个 shell-globbing 通配符,并且不是一个正则表达式 *,它是“零个或多个量词”。 好点,虽然我了解到使用正则表达式可能是获得预期匹配的更好做法。 【参考方案1】:使用 egrep 风格的扩展模式匹配。
ls !(*.jar)
这从 bash-2.02-alpha1 开始可用。 必须先启用
shopt -s extglob
从 bash-4.1-alpha 开始,默认情况下有一个配置选项可以启用此功能。
【讨论】:
很高兴提到 shopt -s extglob! 这是正确答案。标记为正确的答案不直接使用 shell,它使用辅助命令。 @dbw - 即使我更喜欢这个答案,接受的答案也可以解决这个问题。 OP 并未明确要求使用“直接外壳”。 "egrep-style" 非常具有误导性,因为 grep 处理正则表达式,而这里是 shell 模式。 它对我不起作用。对于返回大约 2000 个项目的长列表,我得到“argument list to long”。我猜这是因为分支扩展了它们内部命令的输出。所以它变成了一个包含大约 2000 个项目的参数列表,真的很长。【参考方案2】:ls | grep -v '\.jar$'
例如。
【讨论】:
如何处理两种文件类型? @Silver89,ls | grep -v -e '\.one$' -e '\.two$'
例如。
Don't parse the output of ls
,谢谢。
使用 ls --ignore='\.jar' 来避免调用另一个程序会更有效。
@xizdaqrian,好点,不知道。但我相信它只适用于 gnu。【参考方案3】:
鲜为人知的 bash 扩展规则:
ls !(*.jar)
【讨论】:
bash: !: 找不到事件。我需要什么? 尝试先在命令行执行'shopt -s extglob',然后输入命令。【参考方案4】:使用适当版本的find
,您可以执行以下操作,但这有点矫枉过正:
find . -maxdepth 1 ! -name '*.jar'
find
查找文件。 .
参数指定您要从 .
开始搜索,即当前目录。 -maxdepth 1
告诉它你只想搜索一层深度,即当前目录。 ! -name '*.jar'
查找所有不 匹配正则表达式*.jar
的文件。
就像我说的,这对这个应用程序来说有点矫枉过正,但如果你删除了-maxdepth 1
,你就可以递归地搜索所有非 jar 文件或者你有什么。
【讨论】:
我喜欢这个,因为它也可以在 zsh 中使用,而某些 bash 扩展程序则不能(至少在我的 zsh 技能水平下不是:D)【参考方案5】:POSIX 定义了不匹配的括号表达式,所以我们可以让 shell 为我们扩展文件名。
ls *[!j][!a][!r]
虽然这有一些怪癖,但至少它与任何 unix shell 兼容。
【讨论】:
+1 用于 POSIX 合规性。一个小 bash/python/ruby 函数与别名结合,即"lsnot" 可以使它很容易工作。 这不匹配少于三个字符的内容。【参考方案6】:如果您的 ls
支持它 (man ls
),请使用 --hide=<PATTERN>
选项。在你的情况下:
$> ls --hide=*.jar
无需解析ls
的输出(因为它非常糟糕),它可以扩展到不显示多种类型的文件。在某些时候,我需要查看(杂乱的)目录中有哪些非源、非对象、非 libtool 生成的文件:
$> ls src --hide=*.lo,c,h,o
工作就像一个魅力。
【讨论】:
【参考方案7】:另一种方法是使用ls -I
标志(忽略模式)。
ls -I '*.jar'
【讨论】:
【参考方案8】:如果您想排除多个文件扩展名,请使用管道|
将它们分隔开,例如ls test/!(*.jar|*.bar)
。让我们试试吧:
$ mkdir test
$ touch test/1.jar test/1.bar test/1.foo
$ ls test/!(*.jar|*.bar)
test/1.foo
查看您可能需要先shopt -s extglob
的其他答案。
【讨论】:
您可以将其缩短为!(*.[bj]ar)
。【参考方案9】:
一个解决方案是ls -1|grep -v '\.jar$'
【讨论】:
Don't parse the output ofls
,谢谢。
@gniourf_gniourf 不要对诸如解析ls
或使用goto
之类的规则抱有偏见。有时这些解决方案效果最好。
这不是其中一种情况;即使您不想使用 --ignore
或 Bash 的扩展通配符,find . -print0 | grep -z '\.jar$'
也能更好地工作。也就是说,大多数人不想阅读整篇文章来理解规则或他们应该做什么,你可以给出一个简单的解释和建议,比如“它在极端情况下不起作用;在评论中使用find -print0
和grep -z
。【参考方案10】:
一些提到的这种形式的变体:
ls -d *.[!j][!a][!r]
但这似乎只适用于 bash,而这似乎适用于 bash 和 zsh:
ls -d *.[^j][^a][^r]
【讨论】:
【参考方案11】:ls -I "*.jar"
它无需执行任何操作即可工作 它也适用于手表报价:-I, --ignore=模式 不列出与 shell PATTERN 匹配的隐含条目
watch -d 'ls -I "*.gz"'
,不像watch 'ls !(*.jar)'
产生:sh: 1: Syntax error: "(" unexpected
注意:由于某些原因,Centos 需要在
-I
之后引用模式,而 Ubuntu 不需要
【讨论】:
发布模式符号文件 .dll.mdb 中的 Fody 异常与程序集 .dll 不匹配
...试模式下工作正常,但fody在发布模式下抛出异常。下面列出了构建期间的异常。Erro 查看详情
未腌制的对象与原始对象不匹配
...了,因为我已经尝试了各种文件模式与下面我的代码上方列出的相应错误:f=open(home+\'/.GMouseCfg\',\' 查看详情
当文件名与模式列表不匹配时,批处理脚本删除文件
】当文件名与模式列表不匹配时,批处理脚本删除文件【英文标题】:batchscriptdeletefileswhenfilenamedoesnotmatchlistofpatterns【发布时间】:2020-10-0208:30:42【问题描述】:我想删除目录中的所有文件,但名称与特定模式匹配的文件除外。... 查看详情
在 Groovy 中递归列出与特定文件类型匹配的所有文件
】在Groovy中递归列出与特定文件类型匹配的所有文件【英文标题】:RecursivelistingofallfilesmatchingacertainfiletypeinGroovy【发布时间】:2011-04-0909:29:02【问题描述】:我正在尝试递归地列出与Groovy中特定文件类型匹配的所有文件。Thisexam... 查看详情
在erlang中列出尾部模式匹配
】在erlang中列出尾部模式匹配【英文标题】:listtailpatternmatchinginerlang【发布时间】:2018-12-2609:57:09【问题描述】:假设我有两个列表:First=[1,2,3,4].Second=[1,2,3,4,234242].我知道第二个列表的所有元素都与第一个列表的元素匹配,除... 查看详情
从与模式不匹配的 M3U 文件中删除多行
】从与模式不匹配的M3U文件中删除多行【英文标题】:DeletemultiplelinesfromanM3Ufilethatdoesnotmatchpattern【发布时间】:2015-11-0610:22:20【问题描述】:我有一个m3u文件,我想从中删除一些行。我知道我想从m3u文件中保留哪些频道。我想... 查看详情
混合测试 - 测试模式与任何文件都不匹配
】混合测试-测试模式与任何文件都不匹配【英文标题】:MixTest-Testpatternsdidnotmatchanyfile【发布时间】:2017-02-0807:54:20【问题描述】:我为我的Elixir项目编写了一些测试并将它们放在test/目录中。现在我运行mixtest,我得到:$mixtestT... 查看详情
如果 URL 与 Go 中的任何模式都不匹配,如何提供文件?
】如果URL与Go中的任何模式都不匹配,如何提供文件?【英文标题】:HowtoserveafileifURLdoesn\'tmatchtoanypatterninGo?【发布时间】:2016-07-3023:51:57【问题描述】:我正在使用Angular2和Go构建单页应用程序,在Angular中我使用路由。如果我在... 查看详情
hg 删除 .hgignore 中列出的所有文件
】hg删除.hgignore中列出的所有文件【英文标题】:hgremoveallfileslistedin.hgignore【发布时间】:2013-11-1803:48:30【问题描述】:我有一个带有.hgignore文件的善变回购。我想从这个repo中的磁盘(hgremove)中删除与.hgignore中列出的模式匹配的... 查看详情
django 与模板中调用的模式不匹配
】django与模板中调用的模式不匹配【英文标题】:djangodoesnotmatchpatterncalledintemplate【发布时间】:2015-07-0420:02:53【问题描述】:我试图在模板中调用%url%以获得动态链接,但我得到一个错误,尽管模式应该匹配。这是我的文件:ur... 查看详情
目标与目标模式不匹配
】目标与目标模式不匹配【英文标题】:targetdoesn\'tmatchthetargetpattern【发布时间】:2020-07-1222:21:32【问题描述】:我正在编译(和链接)我的Linux驱动程序代码,并在模块链接时收到以下错误。我试图检查我的Makefile是否有任何潜... 查看详情
linux正则表达式
...件读取模式作为匹配。-i:模式匹配时忽略大小写差异。-l:列出匹配模式的文件名称,而不是打印匹配的行。-q:静默的,如果匹配成功,不将匹配的行输出到标准输出;否则即是不成功。-s:不显示错误信息,通常与-q并用。-v:显示... 查看详情
vscode package.json 字符串与模式不匹配
】vscodepackage.json字符串与模式不匹配【英文标题】:vscodepackage.jsonStringdoesnotmatchthepattern【发布时间】:2018-07-1913:46:09【问题描述】:我正在一个使用npm的现有项目上试用VSCode,该项目有一个package.json文件,该文件具有相应的“na... 查看详情
npm glob 模式与子目录不匹配
】npmglob模式与子目录不匹配【英文标题】:npmglobpatternnotmatchingsubdirectories【发布时间】:2015-11-0803:06:10【问题描述】:在我的package.json中,我有一个使用**/*Test.js匹配文件的脚本块。通过npm运行时,它们与子目录的匹配不超过一... 查看详情
如何在 Google BigQuery 中列出与特定名称匹配的表?
】如何在GoogleBigQuery中列出与特定名称匹配的表?【英文标题】:HowdoIlisttablesinGoogleBigQuerythatmatchacertainname?【发布时间】:2016-12-0720:43:03【问题描述】:我在BigQuery中使用基于模板后缀的表。为了真正利用这些优势,我需要将查... 查看详情
不太会
...档Ubuntu软件管理dpkg-ipackage.deb安装包dpkg-Ppackage删除包dpkg-l列出当前已安装的包dpkg-lpackage显示该包的简要说明dpkg-Lpackage列出该包中所包含的文件dpkg-Spattern搜索包含pattern的包dpkg-spackage列出该包的状态,包括详细信 查看详情
“sed”与模式不匹配
】“sed”与模式不匹配【英文标题】:"sed"doesn\'tmatchpattern【发布时间】:2021-05-2302:18:08【问题描述】:我正在尝试格式化剪切、粘贴输出,但sed不起作用。文件.txtAppleBananaAppleBananaOrangeAppleOrangecode.shcut-f2file.txt|sort|uniq|sed\... 查看详情
shellgrep命令详解
...-c:统计找到的符合条件的字符串的次数;(7)-A数字:列出符合条件的行,并列出后续的n行;(8)-B数字:列出符合条件的行,并列出前面的n行;(9)--color=auto:搜索出的关键字用颜色显示;(10)-o:只输出匹配到的文本部... 查看详情