在Linux中,DOS“ dir / s / b filename”的含义是什么?


17

列出当前目录中或目录下与“文件名”匹配的所有文件/目录。

Answers:


28

直接等效为

find . -iname <filename>

它将<filename>忽略大小写列出当前目录和所有子目录中调用的所有文件和目录。

如果您的find版本不支持-iname,则可以使用-name。请注意,不同于-iname-name区分大小写。

如果您只想列出名为的文件<filename>,而不是目录,请添加-type f

find . -iname <filename> -type f

如果要使用通配符,则需要在其周围加上引号,例如

find . -iname "*.txt" -type f

否则外壳会扩展它。

正如其他人指出的,您还可以执行以下操作:

find . | grep "\.txt$"

grep 将根据正则表达式打印行,这些正则表达式比通配符更强大,但是语法不同。

请参阅man findman grep了解更多详细信息。


3
如果<filename>包含通配符,请使用引号引起来,例如find . -name '*.txt'
吉尔(Gilles)“所以,别再邪恶了”,

@吉尔斯,更新我的回答说,谢谢。
Mikel

2
使用<filename>作为标志物userinput是在命令行环境中的坏习惯,其中< and >大部分时间都有特定的含义。我建议只使用filenameFILENAME来强调它。大多数人都会理解,而那些不会的人可能会在不了解自己不应该撞击小于或大于撞击时造成伤害。
用户未知

2
<filename>是许多UNIX文档中的约定,因此我认为对于人们来说这很有用,但是我同意FILENAME可能更容易理解。
Mikel

1
find -iname <filename>会更好,因为它与DOS一样不区分大小写
Agnel Kurian14年

8

一些shell允许使用ls **/filename,这非常方便。


1
好点子。在最新版本的bash中,运行shopt -s globstar; echo **/filename等效于find . -name "filename"。它也可以在zsh中使用。
Mikel

这个'ls ** / filename'很好,但是似乎不超过一个目录级别。
Sopalajo de Arrierez 2014年

@ sopalajo-de-arrierez如果您这样做shopt -s globstar,则可能对您有用。递归globing是仅在某些Shell中可用的功能,有时默认情况下不启用。
Shawn J. Goff 2014年

运......,我现在明白了,@ ShawnJ.Goff:该shopt命令启用了该选项globstar on。现在,它就像一种魅力。非常感谢。
Sopalajo de Arrierez 2014年

4

你可以用

find . | egrep filename

1
您也可以使用以下方法合而为一find . -regextype posix-egrep -regex '.*filename.*'(我不知道该egrep部分是否重要,但是您egrep在回答中使用了该部分,因此我将其包括在内)
Michael Mrozek

您可以,但是grep与等效的DOS命令不同。 grep使用正则表达式,而DOS命令使用外壳通配符。
Mikel

1
想到这一点,shell全局变量也不同于DOS通配符。例如,find . -name "*.*"不会在DOS背景下做您期望的事情。尽管正则表达式是一种全新的野兽,但globs足够接近以至于可以被识别。
詹德(Jander)

*.*.*在现代dos中,即Windows cmd,该怎么做?那*.*.*.*
ctrl-alt-delor

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.