(cp f1.txt f2.txt) 和 (less f1.txt > f2.txt) 之间有什么区别

(cp f1.txt f2.txt) 和 (less f1.txt > f2.txt) 之间有什么区别

我知道两者都会将数据从 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 对比cp0.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可以从中提取文本信息。

相关内容