cp vs. cat复制文件


12

cp a bcat a > b,有什么区别?

在Linux内核的源代码树(arch/x86/boot/install.sh)的x86安装脚本中,两者都被使用:

cat $2 > $4/vmlinuz
cp $3 $4/System.map

如果一种格式优于另一种格式,为什么不保持相同的格式呢?

Answers:


15

我想到的另一个问题是,catvs。cp产生显着差异的地方:

根据定义,cat将扩展稀疏文件,用“真实的”零字节填充空白,而至少可以告诉cp保留这些空缺。

稀疏文件是指零字节序列已被元数据替换以节省空间的文件。您可以通过使用dd创建一个进行测试,并使用您选择的工具进行复制。

  1. 创建一个稀疏文件(为避免麻烦,请预先更改为/ tmp-请参阅最后的注释):

    15> cd /tmp
    16> dd if=/dev/null of=sparsetest bs=512b seek=5 
    0+0 records in 
    0+0 records out 
    0 bytes (0 B) copied, 5.9256e-05 s, 0.0 kB/s
  2. 调整大小-它不应占用任何空间。

    17> du -sh sparsetest
    0       sparsetest
  3. 用cp复制并检查大小

    18> cp sparsetest sparsecp
    19> du -sh sparsecp
    0       sparsecp
  4. 现在用猫复制并检查尺寸

    20> cat sparsetest > sparsecat
    21> du -sh sparsecat
    1.3M    sparsecat
  5. 尝试使用您喜欢的工具来检查其行为

  6. 不要忘记清理。

最后要注意的是:如果您在备份计划的一部分文件系统上进行此类实验,或者对系统的健康至关重要,那么类似的实验就必然会在本地系统管理员中扬名。根据他选择的备份工具的不同,他可能最终需要比他认为可以备份的一个0字节文件更多的磁带介质,该文件被扩展为TB的零。

无法使用cat或cp复制的其他文件将包括设备专用文件等。这取决于复制工具的实现,如果它能够复制设备节点,或者它是否愿意复制其内容。


1
因此,cp使文件像原始文件一样,同时cat创建具有相同内容的新文件。
2012年

两种工具都可以在内容上运行,但是cp(至少是“现代”实现)如今知道一些特殊功能,例如漏洞(cat的旧实现会遇到该陷阱)。还有一些文件系统不了解稀疏文件的概念,例如HFS +(MacOS)或FAT(MSDOS,USB-Sticks等),导致它们被炸毁到其完整大小。因此,在某些星座中,cp或cat不会在实践中有所作为。
Tatjana Heuser 2012年

顺便说一句,GNU cp有一个选项可以控制其对稀疏文件的行为。如--sparse=never在命令行上指定的cp一样慢cat
oguz ismail

6

根据Keith的评论cp保留一些权限,并按指示cat创建新文件umask。因此,$2不会保留$4/vmlinuz非常干净的权限,而如果在上设置了一些奇怪的权限$3$4/System.map则会保留该权限。


这是归因于速度的原因cat吗?
Nikhil Mulley 2012年

2
cat更快吗?
2012年

4

在这两种情况下,两者都具有相同的功能,但是cp纯粹是文件操作。“获取此文件,然后在那儿制作一个副本”。

另一方面,cat旨在将文件内容转储到控制台。“获取此文件并将其显示在屏幕上”,然后让忍者攻击屏幕并将输出重定向到其他位置。

cp通常会更高效,因为没有重定向,只是将字节从位置A直接复制到位置B。

猫会的read bytes -> output to console -> intercept output -> redirect to new file


3
cat不会output to console -> intercept output -> redirect to new file,cat的输出文件可以是stdout或普通文件,只要输入与输出不同就可以输出到该文件。

4
cat与控制台无关。双方catcp从输入文件,并写入到输出文件中读取。使用cat,通过外壳打开输出文件,而使用cp,通过打开外壳文件cp;这在性能上没有区别。cp可能更快,但出于完全不同的原因:一些实现cp尝试根据源设备和目标设备猜测正确的块大小以提高性能;的实现cat不会打扰。
吉尔(Gilles)'所以

2

恕我直言,这实际上是一个偏好问题。

除非您将cp命令与-p开关一起使用以保留文件所有权/组,否则从技术上讲,这没有真正的区别。否则,功能上是相同的。Marc的答案更加详细和准确。


3
cp没有-p会保留一些权限。例如,如果源文件是可执行文件,cp则将使目标文件可执行,但cat不能执行。
基思·汤普森

好点子!因此vmlinuz是否将不可执行$2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.