为什么ls --ignore
不忽略模式呢?
看下面的例子:
mkdir books
cd books
touch books_abby.csv
touch books_karen.csv
touch books_david.csv
touch books_tom.csv
这将创建四个文件:
$ ls
books_abby.csv books_david.csv books_karen.csv books_tom.csv
但是,如果您想忽略所有包含“tom”的文件名并列出它们,books_tom.csv
仍然会返回:
$ ls *.csv --ignore="*tom*"
books_abby.csv books_david.csv books_karen.csv books_tom.csv
预期结果是包含“tom”的文件被省略:
$ ls *.csv --ignore="*tom*"
books_abby.csv books_david.csv books_karen.csv
答案1
该标志在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 中有可用的扩展通配符(您可以通过 bash 启用shopt -s extglob
),您可以通过制作排除“tom”的模式来实现您想要的目的。例如ls books_!(tom).csv
会显示books_abby.csv
但不显示books_tom.csv
。
(当然,你可以使用其他工具,如find
、 pipeline togrep -v
等......我只是给出一个纯粹的ls
解决方案。)