它如何与“find”一起使用而不是使用ls?

它如何与“find”一起使用而不是使用ls?

我有这个命令:

ls -Ra | grep -cve/ -e'^\.*$'

我想做同样的事情find

我尝试了这个find . -name "^\.*$" -o -print | wc -l ,但问题是,如果我像这样创建新文件:touch "^.*$" 它不会以相同的方式工作。

请问,有什么想法,如何改变它以使其工作相同吗?

答案1

问题

你想做什么?让我尝试解释一下你的命令,以便我理解它:

ls -Ra | grep -cve/ -e'^\.*$'会给你:

  • 文件、目录、符号链接的数量...
  • 包括当前目录
  • 排除名称仅由点组成的文件: touch '...' (!!!)

解决方案

如果你想做一模一样find,您可以使用:

find . -not -regex '^\.+$' | wc -l

如果超过两点的文件是一个错误,那就是:

find . | wc -l

或者(理论上)使用以下“ls”方式 - 使a大写不会打印当前目录和父目录:

ls -RA | grep -cve/ -e^\$

关于时间安排的一些小知识

               except multidots    all files    number of files
  ls /home                0.75s        0.70s            ~330000
find /home                0.50s        0.50s            ~330000
  ls /                    2.50s        2.50s           ~1350000
find /                    1.90s        1.70s           ~1350000
  ls / [BSD]             10.00s        8.50s            ~250000
find / [BSD]              7.50s        7.50s            ~250000

您可以看到,查找几乎总是更快。但我们还没有优化它!

添加选项-fls跳过排序,从而将处理速度加快约 30%(产生1.60秒for /),是ls -RAf | grep -cve/ -e^\$最快的命令之一。然而,它似乎对 FreeBSD 没有任何作用......

很高兴知道:在 BSD(本例中为 FreeBSD)上检查多个点时的极端时间差异可能主要源于以下方式GNU Grep 有效并且速度更快
BSD 与 Linux 上的时间较长可能只是因为我测试的 BSD 机器慢得多,也可能是因为它使用另一个文件系统。

长话短说

在 Linux 上使用标准工具获取目录内所有文件系统节点数量的最快命令是:

ls -RAf | grep -cve/ -e^\$

一个更短的命令,也是 FreeBSD 上更快的命令(而且,实际上回答了你的问题)是:

find . | wc -l

答案2

不同之处在于,如果您使用,-name则仅匹配文件的基本名称。从man find

-name pattern
     Base of  file  name  (the  path  with  the  leading  directories
     removed)  matches  shell  pattern  pattern.   The metacharacters
     (`*', `?', and `[]') match a `.' at the start of the  base  name
     (this is a change in findutils-4.2.2; see section STANDARDS CON‐
     FORMANCE below). <snip>

要获得与使用时类似的行为,ls -Ra您应该使用-regex

-regex pattern
     File  name  matches regular expression pattern.  This is a match
     on the whole path, not a search. <snip>

相关内容