我知道两者都会将数据从 f1.txt 复制到 f2.txt,但真正的区别是什么?
(cp f1.txt f2.txt)
对比:
(less f1.txt > f2.txt)
答案1
不同之处在于,这cp
对人类来说要清楚得多。这是您应该优化的首要任务之一。
这种使用less
方式非常晦涩难懂,除非您尝试一下,否则它的效果并不明显。另一个答案指出它不起作用 - 如果您的文件包含某些字符,并且您希望该命令在没有用户交互的情况下工作,例如作为脚本的一部分。这个限制是还晦涩难懂(至少我没有想到这一点,尽管已经多次看到这种行为)。
less
恰好速度较慢,原因之一是它以较小的块传输数据。在 下运行它们strace
,我看到less
块 1023 字节 (1KiB - 1); cp 块 64KiB。
答案2
less
被设计为寻呼机(例如.与下一页功能)对于文本文件。因此,它在复制文件方面的优化程度比cp
(旨在复制数据)要低,并且可能会产生相当大的开销,从而缺乏性能。
对于初学者来说,cp
在处理包含特殊(例如控制)字符的文件时不会要求您确认。
在您的cp
示例中,您需要准确运行一程序 (cp
) 。
在less
示例中,该less
命令实际上仅将给定文件的内容输出到,stdout
并且您的 shell 将 stdout 重定向到一个新文件,因此您实际上正在运行两个程序(一个输出,一个输入)。
答案3
该
cp
变体速度更快,因为它不会将f1.txt
内容转储到屏幕上:$ time cp f1.txt f2.txt real 0m0.002s user 0m0.004s sys 0m0.000s $ rm f2.txt $ time less f1.txt > f2.txt real 0m0.009s user 0m0.004s sys 0m0.000s
0.002 对比cp
0.009 less
。
cp
可以保存原始文件的一些模式位,同时less
根据umask
值创建具有模式的新文件:
(...) each destination file is created with the mode bits of the corresponding source file, minus the bits set in the umask and minus the set-user-ID and set-group-ID bits.
cp
打字时间较短。说真的,当你大部分时间都花在命令行上时,这一点很重要。
答案4
既然您询问的是*.txt
文件,那么使用 就有一个小小的好处less
,那就是使用它的预处理功能“修改文件内容的显示方式”。一个人为的示例是将压缩文件的内容输出到输出:
less compressed.txt.gz > uncompressed.txt
但当然,这可以而且可能应该由zcat -c compressed.txt.gz > uncompressed.txt
.
不过,我猜测这对于预处理标准化的环境来说是实用的less
(检查环境变量LESSOPEN
,它通常指向一个文件/usr/bin/lesspipe.sh
),这样脚本/命令就不需要关心解析将输入文件写入目标文件。
我也发现了这个关联它显示了更多用例。如上所述,检查您的 Linux 环境,/usr/bin/lesspipe.sh
看看有哪些文件less
可以从中提取文本信息。