在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 的内置print
或printf
。
答案4
似乎这就是您正在寻找的答案。这篇文章谈到全球扩张是只显示某些内容的原因。