假设我有如下典型的商用 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
答案4
不要将 grep 与 ls 一起使用,
在 bash 中,您可以显示名称中包含“2010”但不以数字开头的文件:
ls -l *[!0-9]2010*