我的问题可能听起来有点奇怪,但今天早上我读到了这个问题:
为什么“回声”比“触摸”快得多?
我完全理解内置函数的概念,但我不知道你是否也举同样的例子:
#!/bin/bash (or any other shell if it's possible in another)
for file in `find . -name "*.xml"`;
do
touch $file;
done
是否有可能进行预加载,touch
这样您就不需要每次使用它时都分叉它,然后变得更快?
答案1
实际上,内核会将可执行文件及其所需的任何文件(例如库)缓存在 RAM 中。
shell 没有办法做任何事情。如果是外部程序,则需要执行。 Unices(不包括像 Cygwin 这样的 UNIX 模拟层)往往会使加载程序变得非常高效,但它永远不会像执行内置命令那么快。
您可以通过将呼叫分组到 来节省时间touch
。首先,你不应该在 的输出上使用命令替换find
:这绝对没有优点,但有几个缺点:
- 如果您的文件名包含空格或通配符,它将中断。
- 它比较慢,因为首先
find
需要完成对目录树的遍历,然后才开始处理。 - 它使用更多内存来存储
find
.
find
make执行命令,而不是循环结果。find
是为这种用途而设计的。
find . -name "*.xml" -exec touch {} \;
现在,由于touch
可以一次处理多个文件,只需替换\;
为+
,瞧,touch
将批量调用包含尽可能多的文件。
find . -name "*.xml" -exec touch {} +
如果您需要 shell 脚本的性能,内置命令总是会击败外部命令,除非您正在操作大量数据。例如,sed
如果您有一行文本,则使用 shell 的字符串处理结构比调用要快得多(并且由于引用问题而不易出错) 。另一方面,sed
如果您有数百万行要处理,请使用 或其他专用外部工具。
如果您要创建新文件,则可以将 的使用替换touch -- "$file"
为: >"$file"
。没有这样的快捷方式可以将现有文件的日期更改为当前时间。
Shell 有一些内置命令,可以作为外部命令实现,但出于性能考虑,这些命令是内部命令。echo
就是一个很好的例子。还有一些带有附加内置命令的 shell,可用于外部命令可能被破坏或进程表已满等情况下的救援情况。例如,zsh 附带zsh/files
模块包含诸如mkdir
和 之类的命令mv
,但不包含touch
.窗扇有-touch
内置的。
答案2
find . -name "*.xml" -print0 | xargs -0 touch
学习查找|参数