Gre*_*reg 7 ls filesystems directory search files
为什么不ls --ignore忽略模式?
看下面的例子:
mkdir books
cd books
touch books_abby.csv
touch books_karen.csv
touch books_david.csv
touch books_tom.csv
Run Code Online (Sandbox Code Playgroud)
这将创建四个文件:
$ ls
books_abby.csv books_david.csv books_karen.csv books_tom.csv
Run Code Online (Sandbox Code Playgroud)
但是,如果您想忽略所有包含“tom”的文件名并列出它们,books_tom.csv仍会返回:
$ ls *.csv --ignore="*tom*"
books_abby.csv books_david.csv books_karen.csv books_tom.csv
Run Code Online (Sandbox Code Playgroud)
预期结果是省略包含“tom”的文件:
$ ls *.csv --ignore="*tom*"
books_abby.csv books_david.csv books_karen.csv
Run Code Online (Sandbox Code Playgroud)
B L*_*yer 11
该标志在ls手册页中如此 描述(重点是我的) ......
不列出与 shell PATTERN 匹配的隐含条目
手册页没有太多关于“隐含”的内容,这到底是什么意思?隐含条目(文件、目录等)是在ls您未明确提供与该条目匹配的参数的情况下返回的条目。匹配项可以是条目的实际名称(ls books_tom.csv ...使用您的示例)或匹配它的 glob(ls *tom.csv例如)。
考虑到其逻辑限制,如果您ls不带参数调用,则返回的所有内容都是隐含的!我假设 最常见的用法--ignore是使用这种ls简单的调用,因为它是执行“列出除 X 之外的所有内容”操作的最简单方法……至少如果您想避免使用任何其他命令。
所以,让我们看看你的命令。随着ls *.csv --ignore="*tom*"“books_tom.csv”明确由匹配模式的方式引用*.csv。使用ls --ignore="*tom*",根据上一段,目录中的所有内容都是隐含的,因此不会显示“books_tom.csv”。
如果您在 shell 中扩展了 globbing(使用 bash 可以启用 with shopt -s extglob),您可以通过制作一个排除“tom”的模式来实现您想要的。例如ls books_!(tom).csv会显示books_abby.csv但不会显示books_tom.csv。
(当然,您可以使用其他工具,如find、管道到grep -v等……我只是给出了一个纯粹的ls解决方案。)