🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习 🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发 ❄️作者主页:一个平凡而乐于分享的小比特的个人主页 ✨收录专栏:Linux,本专栏目的在于,记录学习Linux操作系统的总结 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

想将OSD_On-Screen_Button_Simulation目录下的所有内容拷贝到U盘下,再通过U盘拷贝到Linux系统其他路径下。我先查看当前路径下,文件夹下所有文件的属性,如下:

我将其拷贝到U盘下,再次查看U盘内,目录下的文件属性,如下:

可以看到U盘内存放的文件属性已经发生了变化!!!
于是我问了deepseek关于这个问题,给出了这样的解决方法:

但是我百思不得其解,在网上搜索后才知道本质原因,分享给大家!
源文件(Linux) → cp命令 → FAT32 U盘 → cp命令 → 目标(Linux)
↓ ↓ ↓
权限:rwxr-xr-x 权限:rw-r--r-- 权限:rw-r--r--
(保存在ext4) (FAT32丢弃x权限) (继承U盘的权限)关键点:FAT32像一个"过滤器",只通过它能理解的信息。
源文件(Linux) → tar打包 → FAT32 U盘 → tar解压 → 目标(Linux)
↓ ↓ ↓ ↓
权限:rwxr-xr-x → 打包进.tar文件 → .tar文件原样复制 → 从.tar恢复权限
(ext4文件系统) (二进制数据包) (只是复制字节) (tar读取元数据)# tar会读取文件的:
1. 内容数据(文件的实际字节)
2. 元数据(权限、所有者、时间等)
3. 将这些信息一起编码到.tar文件中
# tar文件内部结构:
[文件头(116字节)] + [文件内容] + [文件头] + [文件内容] + ...
文件头包含:
- 文件名
- 权限模式 (mode)
- 所有者UID
- 所属组GID
- 文件大小
- 修改时间
- 文件类型
- ...等100多个字段backup.tar.gz 只是一个普通的"文件"
FAT32看到的: "有一个叫backup.tar.gz的文件,大小XXX字节"
FAT32不需要理解tar的内部结构,就像不理解.zip文件内部一样# tar会:
1. 读取.tar文件的二进制数据
2. 解析文件头信息
3. 根据文件头中的权限信息创建文件
4. 恢复原始权限和属性# 1. 查看tar文件头信息
tar tvf backup.tar.gz
# 输出示例:
# -rwxr-xr-x tjf/tjf 943 2024-12-26 13:52 install_rules.sh
# ↑ 这里已经包含了权限信息!
# 2. 对比两种方式
# 方式1:直接cp
cp install_rules.sh /mnt/usb/
cp /mnt/usb/install_rules.sh ~/
ls -l ~/install_rules.sh # 显示 -rw-r--r--
# 方式2:tar方式
tar czf install.tar.gz install_rules.sh
cp install.tar.gz /mnt/usb/
cp /mnt/usb/install.tar.gz ~/
tar xzf ~/install.tar.gz
ls -l install_rules.sh # 显示 -rwxr-xr-x因为tar创建了一个自包含的格式:
tar文件 = [元数据] + [数据] + [元数据] + [数据] + ...backup.tar的大文件# cpio - 也保存权限
find . -print | cpio -o > backup.cpio
# zip(需要参数)
zip -r backup.zip . # 默认不保存权限
zip -r --symlinks backup.zip . # 保存符号链接
# rsync(通过网络或ext4文件系统)
rsync -av source/ dest/ # 保存所有属性打包后,重新解压缩已解决:

所以,tar不是"不改变属性",而是它把属性作为数据的一部分保存和恢复,绕过了文件系统的限制。