命令 ls | grep 仅显示目录(当它还应该显示文件时)

命令 ls | grep 仅显示目录(当它还应该显示文件时)

在linux中,我有一个文件,其中包含许多包含文字“scrap”的文件和目录。我可以通过打字ls *scrap*毫无问题地看到它们。然而,这还返回包含文字“scrap”的目录,我想排除这些目录。

我尝试使用ls | grep ".*scrap.*"or ls | grep scrap,但这仅返回目录(而不是普通文件)。

为什么会这样呢?

下一步将是(一旦代表返回正确的输出)从该输出中删除目录。也欢迎就如何做到这一点提出建议!

答案1

实际上,要最终列出当前目录(第一级)中名称中包含的所有常规文件scrap,您不需要ls+ grep

与老好find命令:

find . -maxdepth 1 -type f -name "*scrap*" -ls

答案2

当文件名包含空格或(更糟糕的)换行符时,ls您会遇到问题。grep但是使用安全的文件名,您可以执行以下操作:

ls -l | grep -oP '^-.* \K.*$'
ls -l | sed -n '/^-/s/^.* //p'

但通常你应该使用该find方法。

答案3

scrap对于当前目录中包含,的非目录文件的名称zsh

print -rC1 -- *scrap*(ND^/)

请注意,在ls *scrap*(或更正确的ls -- *scrap*)中,如果任何*scrap*文件的类型为目录,然后ls将列出他们的内容(带有that-scrap-dir:标头,除非*scrap*扩展为该目录中的一个且仅一个文件)。

如果您想要这种类型的文件目录ls只是像其他类型的文件一样打印它们的名称,您需要添加选项-d

ls -d -- *scap*(D^/)

但是,使用它几乎没有任何意义,ls因为在调用时,按名称和类型查找文件的所有工作都已由 shell 完成ls,您不妨使用 shell 的内置printprintf

答案4

似乎就是您正在寻找的答案。这篇文章谈到全球扩张是只显示某些内容的原因。

相关内容