jim jarnac Asked: 2017-11-26 12:59:26 +0800 CST2017-11-26 12:59:26 +0800 CST 2017-11-26 12:59:26 +0800 CST 命令 ls | grep 只显示目录(当它也应该显示文件时) 772 在 linux 中,我有一个文件,其中包含大量包含文字“scrap”的文件和目录。我可以通过打字ls *scrap*毫无问题地看到它们。然而,这也返回包含文字“废品”的目录,我想排除那些。 我尝试使用ls | grep ".*scrap.*"or ls | grep scrap,但这仅返回目录(而不是普通文件)。 为什么会这样? 下一步将是(一旦代表返回正确的输出)从该输出中删除目录。也欢迎就如何做到这一点提出建议! linux grep 4 个回答 Voted Best Answer RomanPerekhrest 2017-11-26T13:06:43+08:002017-11-26T13:06:43+08:00 实际上,要最终列出当前目录(第一级)scrap中名称中包含的所有常规文件,您不需要ls+ grep。 用旧的好find命令: find . -maxdepth 1 -type f -name "*scrap*" -ls Hauke Laging 2017-11-26T13:59:25+08:002017-11-26T13:59:25+08:00 当文件名包含空格或(更糟糕的)换行符时ls,您会遇到问题。grep但是使用安全的文件名,您可以这样做: ls -l | grep -oP '^-.* \K.*$' ls -l | sed -n '/^-/s/^.* //p' 但通常你应该使用这种find方法。 Stéphane Chazelas 2022-06-25T11:33:18+08:002022-06-25T11:33:18+08:00 对于当前目录中包含 的非目录文件的名称scrap,在zsh: print -rC1 -- *scrap*(ND^/) 请注意,在ls *scrap*(或更正确的ls -- *scrap*)中,如果任何*scrap*文件的类型为directory,ls则将列出它们的内容(带有that-scrap-dir:标题,除非*scrap*扩展为一个且只有一个文件是该目录)。 如果您想要目录类型的文件,ls只需像其他类型的文件一样打印它们的名称,您需要添加-d选项: ls -d -- *scap*(D^/) 但是几乎没有任何意义,因为在调用ls时,shell 已经完成了按名称和类型查找文件的所有工作ls,您不妨使用内置的print或printf您的 shell。 Tony 2022-06-25T11:02:56+08:002022-06-25T11:02:56+08:00 似乎这是您正在寻找的答案。这篇文章谈到了全球扩张是为什么只显示某些东西的原因。
实际上,要最终列出当前目录(第一级)
scrap
中名称中包含的所有常规文件,您不需要ls
+grep
。用旧的好
find
命令:当文件名包含空格或(更糟糕的)换行符时
ls
,您会遇到问题。grep
但是使用安全的文件名,您可以这样做:但通常你应该使用这种
find
方法。对于当前目录中包含 的非目录文件的名称
scrap
,在zsh
:请注意,在
ls *scrap*
(或更正确的ls -- *scrap*
)中,如果任何*scrap*
文件的类型为directory,ls
则将列出它们的内容(带有that-scrap-dir:
标题,除非*scrap*
扩展为一个且只有一个文件是该目录)。如果您想要目录类型的文件,
ls
只需像其他类型的文件一样打印它们的名称,您需要添加-d
选项:但是几乎没有任何意义,因为在调用
ls
时,shell 已经完成了按名称和类型查找文件的所有工作ls
,您不妨使用内置的print
或printf
您的 shell。似乎这是您正在寻找的答案。这篇文章谈到了全球扩张是为什么只显示某些东西的原因。