我可以看到ls -R
所有文件和文件夹的列表。我可以grep
从列表中找到文件名。
“查找” 有什么好处?
此外,如果我使用ls -R
而不是,有什么注意事项find
吗?
答案1
ls
列出参数上或参数内部的文件,而find
查找文件,它们的用途完全不同,彼此之间没有任何关系
ls
不做任何匹配,所以如果你想找到匹配的东西任何子目录那么它根本不起作用,除非你的 shell 支持全球星. 在这种情况下find . -name '*some*thing*.*some*ext'
相当于ls **/*some*thing*.*some*ext
ls
不会列出隐藏文件和文件夹,除非-a
使用,所以根本ls -R
不等同于find .
- 一些
find
实现(如 GNU 或 BSD)也支持使用正则表达式匹配。您不能使用ls
列出与正则表达式匹配的文件 - 将输出通过管道传输
ls
到命令中ls -Ra | grep
是一件坏事,因为它无法处理名称中包含换行符的文件。更糟糕的是,如果ls
使用别名来使用一些以不同方式打印特殊字符的参数。许多人还在循环ls
中使用输出for
,这可能会在更多情况下失败。请参阅为什么不是解析ls
(以及该做什么)?,解析 ls,不推荐,为什么不应该解析 ls(1) 的输出.find
总是安全的:find . -name 'pattern' -exec command {}
或者find . -name 'pattern' -print0 | xargs -0 your command
- 因为
ls
这只是一个列表工具,所以你无法找到符合以下复杂条件的文件:(*.txt
在folderA
) 或 (*.cfg
在 folderB 中且祖父母是folderC
) 或 (isExecutable 或 hasMode(0624) 或 (file.ext 和 isNewerThan(today)) 或 (somefile 在 3-5 级深度的文件夹中)...
答案2
ls
和之间的根本区别find
其他答案很好,它提出了几个有效的观点;但它没有明确说明我发现ls
和之间的根本区别find
。我不会重复这些观点,我回答的目的是强调根本区别。这里是:
ls
列出文件。find
评估表达式。
这规范find
或者man 1 find
在你的 Linux/Unix 中可能会用以下行来欢迎你:
find
- 查找文件
你可能想知道“查找”和“列出”有什么区别。这个“查找文件”有点误导。真正的目的find
在后面的描述中揭晓:
该
find
实用程序将从指定的每个文件递归下降目录层次结构path
,评估由遇到的每个文件的主要[...]组成的布尔表达式。
如果表达式包含(显式或隐式)-print
,那么是的,find
“查找文件”,即它会打印它们的路径名,因此它类似于ls
。但您不限于此。您可以构建自定义的任意表达式。您可以制作find
做一点事有文件或者因为文件。
我曾经find
在这个网站上回答过很多问题,因此我可以给你举几个例子来说明我的意思。当我链接到答案时,我建议你也阅读相应的问题,看看答案应该解决什么问题。
我的例子:
这个答案描述了
find
一般的工作原理(“理论”部分),然后(后面的部分)专注于查找基于路径名进行测试的文件。从中您可以了解 的“哲学”find
。这个答案
grep
构建用于查找文件的自定义测试。这个问题是可以
find
对文件执行某些操作(在此特定情况下为:删除文件)的一个基本示例。“便携式解决方案”这个答案运行
find
一个或多个 shell 对文件执行自定义操作(在本例中为:移动文件)。此外,还实现了一个计数器,将解决方案限制为 1000 次成功操作。这个答案用途
find
不是查找(列出)文件本身,也不是对文件执行任何操作,而是根据文件执行某些操作。目标是对文件进行计数。“分析”部分可能会让您深入了解什么ls
是不是设计用于。
我认为ls
它是一个相当专业的工具,它的输出设计为人类可读的,同时find
更通用,它的范围超越了查找或列出文件的功能。find
单独使用无法完全替代ls
;ls
支持对条目进行排序的选项,find
不支持(参见这个问题)。
ls -R
verbatim和 sole之间的具体区别find
如果我使用
ls -R
而不是,有什么注意事项吗find
?
除了一般的“不要解析ls
”建议和已经链接答案,我注意到,的输出通常ls -R
由以下形式的块组成:
./path/to/subdir:
filename 1
filename 2
another filename
如果您“grep
从列表中查找文件名”,那么您将看到零个或多个条目,每个条目要么是某个子目录的路径名(带有:
附加内容!),要么是某个文件的文件名。很容易获取文件名,而无需了解文件在何处(在哪个子目录中)。
另一方面,sole find
(在许多实现中等同于find . -print
)总是为您提供路径名。虽然grep
在 的输出上使用find
不一定是最好的主意(最好的主意可能是用-name
、-path
、-regex
(如果支持)等创建一个好的表达式),但它几乎总是比grep
在 的输出上使用 更好ls -R
;除非您只是想知道是否存在具有匹配名称的文件,否则在哪里它存在。