浅谈 Linux 文件覆盖机制
引言:文件覆盖的本质
文件覆盖是 Linux 文件系统中常见的操作,指将源文件内容写入目标路径,导致目标文件原有内容被替换或新文件被创建。覆盖操作通常通过命令行工具(如 mv
、cp
)或系统调用(如 open()
以写模式)触发,其核心涉及文件系统的元数据管理、数据块分配及权限检查。目标文件是否存在会显著影响操作行为,尤其是对于 mv
和 cp
等命令。
本文聚焦 mv
命令的覆盖机制,分析其在目标文件存在和不存在时的行为,并与 cp
、shell 重定向等操作对比,探讨文件覆盖的底层原理及最佳实践。
一、mv
命令的文件覆盖行为
1. 目标文件存在:普通文件覆盖
当目标文件 b
存在且为普通文件时,mv a b
会将源文件 a
的内容覆盖到 b
上,具体步骤如下:
- 权限检查:确认用户对源文件
a
有读权限(r
),对目标文件b
有写权限(w
),且对包含b
的目录有写(w
)和执行(x
)权限。 - 数据替换:释放
b
的原有数据块,将a
的数据块关联到b
的文件名。 - 元数据保留:
b
的权限、所有者、时间戳等元数据保持不变,仅内容被替换。
示例:
# 文件 a: 内容 "hello",权限 rwxr-xr-x (755)
# 文件 b: 内容 "world",权限 rw-r--r-- (644)
mv a b
操作后,b
内容变为 “hello”,权限仍为 rw-r--r--
,a
被删除。原 b
内容不可恢复,除非有备份。
2. 目标文件不存在
若目标文件 b
不存在,mv a b
直接将文件 a
重命名为 b
,不涉及覆盖。操作步骤如下:
- 权限检查:确认用户对
a
有读权限,对包含b
的目录有写和执行权限。 - 目录更新:在目标目录中创建指向
a
数据块的新目录条目,命名为b
。 - 删除源文件:从原目录移除
a
的目录条目。
示例:
# 文件 a: 内容 "hello",权限 rwxr-xr-x (755)
# 文件 b: 不存在
mv a b
操作后,文件 b
创建,内容为 “hello”,权限为 rwxr-xr-x
,a
被删除。
3. 目录与符号链接的特殊情况
- 目标为目录:若
b
是目录,mv a b
将a
移动到b
中,成为b/a
,不触发覆盖。 - 目标为符号链接:
- 若
b
指向普通文件,mv a b
覆盖符号链接指向的文件。 - 若
b
指向不存在的文件(死链接),mv a b
用a
替换b
,创建普通文件。 - 若
b
不存在,mv a b
创建普通文件b
,行为同普通文件不存在。
- 若
示例:
ln -s /path/to/target b
mv a b
若 /path/to/target
存在且为普通文件,a
覆盖 /path/to/target
;若不存在,b
被替换为普通文件。
4. 特殊文件与设备文件
若 b
是特殊文件(如设备文件、管道或套接字),mv
通常不会覆盖,而是报错或将 a
移动到 b
所在目录,避免破坏系统关键文件。
二、cp
命令的文件覆盖行为
1. 目标文件存在
cp a b
将 a
的内容复制到 b
,覆盖 b
的原有内容。操作特点:
- 保留源文件:
a
不被删除。 - 权限继承:
b
的权限保持不变,除非使用--preserve=mode
保留a
的权限。 - 覆盖提示:默认覆盖,可用
-i
提示确认。
示例:
cp a b
b
内容被 a
替换,权限不变。
2. 目标文件不存在
若 b
不存在,cp a b
创建新文件 b
,内容复制自 a
,权限通常继承 a
(受 umask 影响)。
示例:
# 文件 a: 内容 "hello",权限 rwxr-xr-x (755)
# 文件 b: 不存在
cp a b
操作后,b
创建,内容为 “hello”,权限为 rwxr-xr-x
(可能受 umask 调整)。
三、文件覆盖的权限管理
文件覆盖涉及以下权限检查:
- 源文件:需要读权限(
r
)。 - 目标文件:存在时需写权限(
w
);不存在时,需在目标目录有写(w
)和执行(x
)权限。 - 目录:包含目标文件的目录需写和执行权限。
注意:mv
和 cp
不更改目标文件权限,需用 chmod
手动调整。
示例:
ls -l
-rwxr-xr-x 1 user group 5 Jun 01 12:00 a
-rw-r--r-- 1 user group 5 Jun 01 12:00 b
mv a b
ls -l
-rw-r--r-- 1 user group 5 Jun 01 12:00 b
四、与其他覆盖方式的对比:Shell 重定向
Shell 重定向(如 >
)是另一种覆盖方式:
- 覆盖:
echo "new content" > b
覆盖b
内容。 - 追加:
>>
追加内容,不覆盖。 - 行为:由 shell 处理,依赖 shell 配置,不直接调用文件系统命令。
目标不存在:>
或 >>
创建新文件,权限受 umask 影响。
五、文件覆盖的风险与防范
文件覆盖可能导致数据丢失,以下是防范措施:
- 交互模式:
mv -i
或cp -i
在覆盖前提示。 - 禁止覆盖:
mv -n
或cp -n
避免覆盖。 - 备份:
mv --backup
或cp --backup
创建备份(如b~
)。 - 快照:使用 Btrfs/ZFS 文件系统快照恢复数据。
- 版本控制:重要文件用 Git 或定期备份。
六、文件覆盖的底层机制
以 ext4 文件系统为例,覆盖操作涉及:
- 索引节点(inode):
mv
将源文件数据块关联到目标文件的 inode,元数据不变。 - 目录更新:调整目标目录条目,指向新数据块。
- 跨文件系统:
mv
复制数据后删除源文件,类似cp
。
目标文件不存在时,mv
仅更新目录条目,创建新文件名;cp
分配新 inode 和数据块。
相关文章:
浅谈 Linux 文件覆盖机制
引言:文件覆盖的本质 文件覆盖是 Linux 文件系统中常见的操作,指将源文件内容写入目标路径,导致目标文件原有内容被替换或新文件被创建。覆盖操作通常通过命令行工具(如 mv、cp)或系统调用(如 open() 以写…...

美化显示GDB调试的数据结构
笔者在前面的博文记一次pdf转Word的技术经历中有使用到mupdf库,该库是使用C语言写的一个操作PDF文件的库,同时提供了Python接口,Java接口和JavaScript接口。 在使用该库时,如果想要更高的性能,使用C语言接口是不二的选…...

一篇学习CSS的笔记
一、简介 Cascading Style Sheets简称CSS,中文翻译为层叠样式表。当HTML被发明出来初期,不同的浏览器提供了各种各样的样式语言给用户控制网页的效果,HTML包含的显示属性并不是很多。但是随着各种使用者对HTML的需求,HTML添加了大…...
Rust 学习笔记:自定义构建和发布配置
Rust 学习笔记:自定义构建和发布配置 Rust 学习笔记:自定义构建和发布配置发布配置文件自定义 profile 的选项 Rust 学习笔记:自定义构建和发布配置 发布配置文件 在 Rust 中,发布配置文件是预定义的和可定制的概要文件…...

StarRocks x Iceberg:云原生湖仓分析技术揭秘与最佳实践
导读: 本文将深入探讨基于 StarRocks 和 Iceberg 构建的云原生湖仓分析技术,详细解析两者结合如何实现高效的查询性能优化。内容涵盖 StarRocks Lakehouse 架构、与 Iceberg 的性能协同、最佳实践应用以及未来的发展规划,为您提供全面的技术解…...

笔试笔记(运维)
(数据库,SQL) limit1 随机返回其中一个聚合函数不可以嵌套使用 【^】这个里面的数据任何形式组合都没有 sql常用语句顺序:from-->where-->group by-->having-->select-->order by-->limit 只要其中一个表存在匹…...
JVM——云原生时代JVM的演进之路
引入 在风云变幻的技术世界里,JVM(Java Virtual Machine)作为 Java 语言的基石,长久以来承载着无数开发者构建软件系统的梦想。从 20 世纪 90 年代 Java 的诞生,到如今云原生时代的大幕拉开,JVM 经历了岁月…...

使用langchain实现五种分块策略:语义分块、父文档分块、递归分块、特殊格式、固定长度分块
文章目录 分块策略详解1. 固定长度拆分(简单粗暴)2. 递归字符拆分(智能切割)3. 特殊格式拆分(定向打击)Markdown分块 4. 语义分割(更智能切割)基于Embedding的语义分块基于模型的端到…...

【项目记录】登录认证(下)
1 过滤器 Filter 刚才通过浏览器的开发者工具,可以看到在后续的请求当中,都会在请求头中携带JWT令牌到服务端,而服务端需要统一拦截所有的请求,从而判断是否携带的有合法的JWT令牌。 那怎么样来统一拦截到所有的请求校验令牌的有…...
Debian上安装PostgreSQL的故障和排除
命令如下: apt install postgresql#可能是apt信息错误,报错 E: Failed to fetch http://deb.debian.org/debian/pool/main/p/postgresql-15/postgresql-client-15_15.12-0%2bdeb12u2_amd64.deb 404 Not Found [IP: 146.75.46.132 80] E: Failed to f…...

linux文件管理(补充)
1、查看文件命令 1.1 cat 用于连接文件并打印到标准输出设备上,它的主要作用是用于查看和连接文件。 用法: cat 参数 文件名 参数: -n:显示行号,会在输出的每一行前加上行号。 -b:显示行号,…...

Python训练营---Day42
DAY 42 Grad-CAM与Hook函数 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 作业:理解下今天的代码即可 1、回调函数 回调函数(Callback Function)是一种特殊的函数,它作为参数传递给另一个函数&#…...

基于空天地一体化网络的通信系统matlab性能分析
目录 1.引言 2.算法仿真效果演示 3.数据集格式或算法参数简介 4.MATLAB核心程序 5.算法涉及理论知识概要 5.1 QPSK调制原理 5.2 空天地一体化网络信道模型 5.3 空天地一体化网络信道特性 6.参考文献 7.完整算法代码文件获得 1.引言 空天地一体化网络是一种将卫星通信…...

c++ opencv 形态学操作腐蚀和膨胀
https://www.jb51.net/article/247894.htm(上图图片来自这个博客) https://codec.wang/docs/opencv/basic/erode-and-dilate(上图图片参考博客) cv::Mat kernel cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)); cv::erode(src, dst, kern…...
Axure组件即拖即用:横向拖动菜单(支持左右拖动选中交互)
亲爱的小伙伴,在您浏览之前,请关注一下,在此深表感谢!如有帮助请订阅专栏!免费哦! Axure横向菜单拖不动?一拖就乱?你缺的是这个"防手残"组件! 💢…...
Hadoop MapReduce:大数据处理利器
Hadoop 的 MapReduce 是一种用于处理大规模数据集的分布式计算框架,基于“分而治之”思想设计。以下从核心概念、工作流程、代码结构、优缺点和应用场景等方面详细讲解: 一、MapReduce 核心概念 核心思想: Map࿰…...
RabbitMQ-Go 性能分析
更多个人笔记见: github个人笔记仓库 gitee 个人笔记仓库 个人学习,学习过程中还会不断补充~ (后续会更新在github和 gitee上) 文章目录 对比功能没有rabbitMQ有rabbitMQwrk 测试分析 链接: 项目连接,完整…...

【c++】【数据结构】红黑树
目录 红黑树的定义红黑树的部分模拟实现颜色的向上更新旋转算法单旋算法双旋算法 红黑树与AVL树的对比 红黑树的定义 红黑树是一种自平衡的二叉搜索树,通过特定的规则维持树的平衡。红黑树在每个结点上都增加一个存储位表示结点的颜色,结点的颜色可以是…...

基于SpringBoot+Redis实现RabbitMQ幂等性设计,解决MQ重复消费问题
解决MQ重复消费问题 一、实现方案 本方案参考 「RabbitMQ消息可靠性深度解析|从零构建高可靠消息系统的实战指南」,向开源致敬! 1、业务层幂等处理: 每个消息携带一个全局唯一ID,在业务处理过程中,首先检查…...
React从基础入门到高级实战:React 生态与工具 - React 单元测试
React 单元测试 引言 在现代软件开发中,单元测试是确保代码质量和可靠性的关键环节。对于React开发者而言,单元测试不仅能帮助捕获潜在的错误,还能提升代码的可维护性和团队协作效率。随着React应用的复杂性不断增加,掌握单元测…...

使用lighttpd和开发板进行交互
文章目录 🧠 一、Lighttpd 与开发板的交互原理1. 什么是 Lighttpd?2. 与开发板交互的方式? 🧾 二、lighttpd.conf 配置文件讲解⚠️ 注意事项: 📁 三、目录结构说明💡 四、使用 C 编写 CGI 脚本…...

DRF的使用
1. DRF概述 DRF即django rest framework,是一个基于Django的Web API框架,专门用于构建RESTful API接口。DRF的核心特点包括: 序列化:通过序列化工具,DRF能够轻松地将Django模型转换为JSON格式,也可以将JS…...

2024年09月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
C/C++编程(1~8级)全部真题・点这里 第1题:有几个PAT 字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位,第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位,第 4 位(A),第 6 位(T)。 现给定字符串,问一共可以形成多少个 PAT? 时间限制:1000 内存限制:26214…...

免费且好用的PDF水印添加工具
软件介绍 琥珀扫描.zip下载链接:https://pan.quark.cn/s/3a8f432b29aa 今天要给大家推荐一款超实用的PDF添加水印工具,它能够满足用户给PDF文件添加水印的需求,而且完全免费。 这款PDF添加水印的软件有着简洁的界面,操作简便&a…...

mqtt协议连接阿里云平台
首先现在的阿里云物联网平台已经不在新购了,如下图所示: 解决办法:在咸鱼上租用一个账号,先用起来。 搭建阿里云平台,参考博客: (一)MQTT连接阿里云物联网平台(小白向&…...

一文详谈Linux中的时间管理和定时器编程
(目录) 先说一些在计算机中需要用到时间的地方:系统日志log、OS调度(时间片、定时器)等等~~ 时间的计量 计时的方式发展:日晷、沙漏 -> 机械钟 -> 石英振荡器、晶振 -> 铯原子钟 -> 氢原子钟 计算机中的计时方式&…...
Ubuntu 安装 Miniconda 及配置国内镜像源完整指南
目录 Miniconda 安装Conda 镜像源配置Pip 镜像源配置验证配置基本使用常见问题 1. Miniconda 安装 1.1 下载安装脚本 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh1.2 执行安装 bash Miniconda3-latest-Linux-x86_64.sh按回车查看许可协议…...

性能优化 - 理论篇:常见指标及切入点
文章目录 引言一、 Java 性能优化的核心思路二、为什么要度量?三、常用性能衡量指标详解3.1 吞吐量与响应速度3.2 响应时间的具体度量:平均响应时间与百分位数3.3 并发量3.4 秒开率(页面秒开)3.5 正确性(功能可用性&am…...
青少年编程与数学 02-020 C#程序设计基础 08课题、字符和字符串
青少年编程与数学 02-020 C#程序设计基础 08课题、字符和字符串 一、字符和字符集1. 字符(Character)定义特点示例 2. 字符集(Character Set)定义特点常见字符集 小结 二、char数据类型1. 定义2. 特点3. 声明和初始化4. 转义字符示…...

【论文阅读 | PR 2024 |ICAFusion:迭代交叉注意力引导的多光谱目标检测特征融合】
论文阅读 | PR 2024 |ICAFusion:迭代交叉注意力引导的多光谱目标检测特征融合 1.摘要&&引言2.方法2.1 架构2.2 双模态特征融合(DMFF)2.2.1 跨模态特征增强(CFE)2.2.2 空间特征压缩(SFS)…...