ls -R 代替 find

ls -R 代替 find

我可以看到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这只是一个列表工具,所以你无法找到符合以下复杂条件的文件:(*.txtfolderA) 或 (*.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单独使用无法完全替代lsls支持对条目进行排序的选项,find不支持(参见这个问题)。


ls -Rverbatim和 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;除非您只是想知道是否存在具有匹配名称的文件,否则在哪里它存在。

相关内容