我有这个命令:
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
您可以看到,查找几乎总是更快。但我们还没有优化它!
添加选项-f
以ls
跳过排序,从而将处理速度加快约 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>