ls *.csv --ignore="*pattern*" 返回包含“pattern”的文件

ls *.csv --ignore="*pattern*" 返回包含“pattern”的文件

为什么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解决方案。)

相关内容