cp vs. cat 复制文件

Qia*_*ian 13 bash linux-kernel

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

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

cat $2 > $4/vmlinuz
cp $3 $4/System.map
Run Code Online (Sandbox Code Playgroud)

如果一个比另一个更好,为什么他们不保持相同的格式?

Tat*_*ser 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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 调整大小 - 它不应该占用任何空间。

    17> du -sh sparsetest
    0       sparsetest
    
    Run Code Online (Sandbox Code Playgroud)
  3. 用cp复制并检查大小

    18> cp sparsetest sparsecp
    19> du -sh sparsecp
    0       sparsecp
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在用 cat 复制它并检查大小

    20> cat sparsetest > sparsecat
    21> du -sh sparsecat
    1.3M    sparsecat
    
    Run Code Online (Sandbox Code Playgroud)
  5. 尝试您喜欢的工具来检查他们的行为

  6. 不要忘记清理。

最后注意事项:如果您在作为备份计划的一部分或对系统健康至关重要的文件系统上进行此类实验,则有可能让您在本地系统管理员中声名鹊起。根据他选择的备份工具,他可能最终需要比他认为可能更多的磁带介质来备份一个 0 字节的文件,该文件被扩展为 TB 的零。

其他既不能用 cat 也不能​​用 cp 复制的文件将包括设备专用文件等。这取决于你的复制工具的实现,它是否能够复制设备节点,或者它是否会快乐地复制其内容。


Qia*_*ian 7

根据基思的评论cp保留一些权限,并cat按照umask指示创建新文件。So$2的权限没有保留,$4/vmlinuz非常干净,而如果设置了一些奇怪的权限$3$4/System.map则会保留它。

  • `cat` 更快吗? (2认同)