ls:不显示在通配符搜索中匹配相同模式的目录,仅显示文件

ls:不显示在通配符搜索中匹配相同模式的目录,仅显示文件

假设我有如下典型的商用 PC 情况:

drwxr-xr-x 1 whatever whoever       3 Oct  3 16:40 invoices2009
drwxr-xr-x 1 whatever whoever       4 Oct  3 16:40 invoices2010
drwxr-xr-x 1 whatever whoever       2 Oct  3 16:40 invoices2011
-rwxr-xr-x 1 whatever whoever  440575 Oct  3 16:40 tax2010_1
-rwxr-xr-x 1 whatever whoever  461762 Oct  3 16:40 tax2010_2
-rwxr-xr-x 1 whatever whoever  609123 Oct  3 16:40 tax2010_3

现在让我们偷懒一下,直接输入:

$ ls -l *2010*

假设有发票2010目录中的某些内容,它不会按预期工作。自从目录名包含2010年年份,ls也会列出文件2010年发票,虽然我只想列出当前目录中的那些。更有趣的是:想象一下tax2010* 文件根本不存在,并且也没有像示例中那样的三个目录,而是其中的 50 个目录。是的,我已经尝试过:ls甚至不会表明哪些文件位于哪个目录中,但只需从上到下列出它们,就像所有文件都驻留在当前目录中一样(除非您明确指定该-R选项,我当然知道)

另外,我知道我find也可以用 来做到这一点,但是还有什么方法可以用简单的ls单行代码(显然,它的语法要简单得多)来完成这项任务?

答案1

看起来您的问题是“如何按模式列出文件,仅排除目录ls”。

没有办法用 pure 来做到这一点ls。您可以组合ls+ grep,例如:

ls -ld *2010* | grep -v '^d'

然而,使用它会更好find

find . -maxdepth 1 -type f -name "*2010*"

答案2

ls -dlp *2010*这将是解决方案的良好开端,但这取决于您希望输出的样子。

答案3

不可能仅使用ls.您需要findls | grep,如中所述拉什的回答。但对于你的具体例子,要回答你在你的评论:

再说一遍:我希望列出当前目录中的tax*文件,但目录“invoices2010”位于同一工作目录中并且也与给定的匹配2010年列表中应跳过通配符模式。

你可以做

ls -l --ignore='invoices*' *tax2010*

它过滤掉任何与ignoreshell 模式匹配的内容。

答案4

不要将 grep 与 ls 一起使用,

在 bash 中,您可以显示名称中包含“2010”但不以数字开头的文件:

ls -l *[!0-9]2010*

相关内容