Linux 文件管理
Linux 文件管理
- 一、链接文件管理
- 1.1 软链接文件 ln -s
- 1.2 硬链接文件 ln
- 1.3 软链接和硬链接的区别
- 1.4 删除链接文件 rm -f
- 二、复制移动文件
- 2.1 复制(拷贝)文件 cp
- 2.2 移动文件 mv
- 三、查看空间使用情况 du、df
- df -h 显示磁盘空间已满,但 du -sh / 统计的大小与 df 结果不一致,可能是什么原因?如何解决
- 四、压缩和解压缩
- 五、文件归档 tar
一、链接文件管理
通过命令 ll
查看 当前目录下所有文件/目录的详细信息
[root@ansible1 ~]# ll
total 8
-rw-------. 1 root root 989 Feb 27 16:19 anaconda-ks.cfg
-rw-r--r--. 1 root root 30 Jul 5 10:57 inventory
1 2 3 4 5 6 71:这部分包括文件类型、所属者权限、所属组权限、其它人权限、控制列表权限
2:文件的 链接数
3:文件所属者,即文件的创建者
4:文件所属组
5:文件的大小, 单位为字节
6:文件的最后一次修改时间
7:文件名/目录名
第一部分的 -rw-r--r--
:
文件类型 | 文件所属者权限 | 文件所属组权限 | 其他用户 | 访问控制列表
- rw- r-- r-- .
1 2 3 4 51 :表示文件的类型- 普通文件d 目录l 链接文件c 字符设备文件b 块设备文件p 管道文件s 套接字文件
在Linux中,链接文件(l)分为两种:
-
软链接文件(Symbolic Link),它也叫符号链接,是一个独立的文件,指向源文件的 “路径字符串”(快捷方式)
-
硬链接文件(Hard Link),给已有的 inode 新增一个 文件名别名(相当于把原文件重新复制一份)
对比维度 | 软链接(Symbolic Link) | 硬链接(Hard Link) |
---|---|---|
本质 | 独立文件,存储源文件的路径(有自己的 inode) | inode 的多个文件名别名(共享 inode) |
跨文件系统 | 支持(只需路径有效,可跨分区 / 磁盘) | 不支持(inode 号仅在当前文件系统内唯一) |
指向对象 | 支持文件和目录 | 仅支持文件(不能指向目录,避免循环引用) |
文件大小 | 仅占用少量空间(存储路径字符串的长度) | 与源文件大小一致(共享数据,无额外存储) |
权限属性 | 权限不影响访问(实际权限由源文件决定) | 与源文件共享权限(修改任一,全部生效) |
删除源文件的影响 | 源文件删除后,软链接变成 “无效链接”(访问时报错) | 仅删除一个 “别名”,文件数据仍存在(需删除所有硬链接 + 源文件,inode 才释放) |
1.1 软链接文件 ln -s
软链接文件也叫符号链接文件(Symbolic Link),它和原文件一样也是一种文件,它与Windows中的快捷方式功能一样,如果源文件删除,那么所创建(指向)的软链接文件也会被破坏
。
当软链接的源文件被删除后,软链接会直接变成无效的 死链接
- 软链接本身不会被自动删除(它仍是一个存在的文件),但它存储的 “路径” 会指向一个不存在的目标;
- 此时软链接的状态被称为 “死链接”,所有对软链接的访问操作都会失败
# 将 /etc/passwd 文件复制到 /root/目录下
[root@bogon ~]# cat /etc/passwd > passwd
[root@bogon ~]# ls
passwd
[root@bogon ~]# ll
total 4
-rw-r--r--. 1 root root 2224 Nov 12 17:06 passwd# 为 /root/passwd 文件创建软链接文件,文件的名称为 passwdlink
[root@bogon ~]# ln -s /root/passwd passwdlink# 查询软链接文件
[root@bogon ~]# ll
total 4
-rw-r--r--. 1 root root 2224 Nov 12 17:06 passwd
lrwxrwxrwx. 1 root root 12 Nov 12 17:07 passwdlink -> /root/passwd# 显示软链接文件对应的文件的内容
[root@bogon ~]# head -n 5 passwdlink
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin# 删除原文件
[root@bogon ~]# rm -f passwd# 查看链接文件已经无效
[root@bogon ~]# ll
total 0
lrwxrwxrwx. 1 root root 12 Nov 12 17:07 passwdlink -> /root/passwd# 当原文件被删除后,软链接文件不能再使用了
[root@bogon ~]# head -3 passwdlink
head: cannot open 'passwdlink' for reading: No such file or directory
1.2 硬链接文件 ln
硬链接文件是相当于把源文件重新复制一份,它有自己的 inode,当移除原文件后,硬链接文件还可以使用
硬链接删除源文件,文件系统会执行以下操作:
- 将文件名从目录中移除
- 将索引节点的链接计数减1
- 如果链接计数仍大于0(即存在硬链接),则保留索引节点和数据块
- 如果链接计数变为0,则释放索引节点和数据块
即使删除了源文件,只要还有硬链接存在,文件的数据仍然可以通过硬链接访问
[root@bogon ~]# touch 1.txt //创建一个名为1.txt的空文件
[root@bogon ~]# ls -il
total 8
34993921 -rw-r--r--. 1 root root 0 Nov 12 17:25 1.txt
34990033 -rw-r--r--. 2 root root 2224 Nov 12 17:18 passwd
34990033 -rw-r--r--. 2 root root 2224 Nov 12 17:18 passwd.hard
34993920 lrwxrwxrwx. 1 root root 12 Nov 12 17:19 passwd.lnk -> /root/passwd[root@bogon ~]# ln -s /root/1.txt 2.txt //创建一个软链接文件
[root@bogon ~]# ls -il
total 8
34993921 -rw-r--r--. 1 root root 0 Nov 12 17:25 1.txt
34993922 lrwxrwxrwx. 1 root root 11 Nov 12 17:25 2.txt -> /root/1.txt
34990033 -rw-r--r--. 2 root root 2224 Nov 12 17:18 passwd
34990033 -rw-r--r--. 2 root root 2224 Nov 12 17:18 passwd.hard
34993920 lrwxrwxrwx. 1 root root 12 Nov 12 17:19 passwd.lnk -> /root/passwd[root@bogon ~]# ln /root/1.txt 3.txt //创建一个硬链接文件
[root@bogon ~]# ls -il
total 8
34993921 -rw-r--r--. 2 root root 0 Nov 12 17:25 1.txt
34993922 lrwxrwxrwx. 1 root root 11 Nov 12 17:32 2.txt -> /root/1.txt
34993921 -rw-r--r--. 2 root root 0 Nov 12 17:25 3.txt
34990033 -rw-r--r--. 2 root root 2224 Nov 12 17:18 passwd
34990033 -rw-r--r--. 2 root root 2224 Nov 12 17:18 passwd.hard
34993920 lrwxrwxrwx. 1 root root 12 Nov 12 17:19 passwd.lnk -> /root/passwd
1.3 软链接和硬链接的区别
- 软链接以路径的形式存在,而硬链接是以副本的方式存在,但不占用实际空间(inode 相同)。
- 软链接可以跨文件系统,而硬链接不可以。
- 软链接可以对一个不存在的文件进行创建,而硬链接只能对同一个文件系统中存在的文件进行创建。
- 软链接可以对目录进行链接,而硬链接不允许。
对比维度 | 软链接(Symbolic Link) | 硬链接(Hard Link) |
---|---|---|
本质 | 独立文件,存储源文件的路径(有自己的 inode) | inode 的多个文件名别名(共享 inode) |
跨文件系统 | 支持(只需路径有效,可跨分区 / 磁盘) | 不支持(inode 号仅在当前文件系统内唯一) |
指向对象 | 支持文件和目录 | 仅支持文件(不能指向目录,避免循环引用) |
文件大小 | 仅占用少量空间(存储路径字符串的长度) | 与源文件大小一致(共享数据,无额外存储) |
权限属性 | 权限不影响访问(实际权限由源文件决定) | 与源文件共享权限(修改任一,全部生效) |
删除源文件的影响 | 源文件删除后,软链接变成 “无效链接”(访问时报错) | 仅删除一个 “别名”,文件数据仍存在(需删除所有硬链接 + 源文件,inode 才释放) |
1.4 删除链接文件 rm -f
[root@bogon ~]# rm -f 3.txt# 删除前面创建的软链接文件
[root@bogon ~]# rm -f passwdlink
[root@bogon ~]# ls
二、复制移动文件
2.1 复制(拷贝)文件 cp
选项说明:
-a :在拷贝文件的同时保留链接、文件属性
-d :拷贝时保留链接
-f :在覆盖已经存在的目标路径时不提示
-r :递归拷贝
cp 拷贝文件时同时复制其属性:
-
常用命令:cp -a(最全面的拷贝)
-a 选项表示 “归档模式”,会递归拷贝目录(若拷贝目录),并保留几乎所有文件属性,包括:- 权限(如 644、755 等)
- 所有者和所属组
- 访问时间和修改时间
- 链接(保持链接属性而非拷贝内容)
-
仅保留基本属性:
cp -p
-p
选项会保留文件的核心属性:- 权限
- 所有者(需要足够权限,如 root)
- 时间戳(访问时间和修改时间)
但不会递归处理目录(拷贝目录需配合 -r
),也不保留链接属性。
- 如果需要在不同文件系统间拷贝(如从本地磁盘到 USB 设备),且要保留所有属性,可使用
rsync
命令(需提前安装):
rsync -a 源文件/目录 目标路径
2.2 移动文件 mv
mv 命令可以移动文件或目录,它也具有重命名的功能。
将newdir目录改名为new
[root@bogon ~]# mv newdir new
[root@bogon ~]# ls
file1 file2 file3 filenew host03 new[root@localhost ~]# ls
anaconda-ks.cfg Documents file1 Pictures Templates
Desktop Downloads Music Public Videos
[root@localhost ~]# mv file1 file2
[root@localhost ~]# ls
anaconda-ks.cfg Documents file2 Pictures Templates
Desktop Downloads Music Public Videos
[root@localhost ~]#
把 /a 目录下 1.txt 改名为 1.c
[root@bogon ~]# ls /a
1.txt b
[root@bogon ~]# mv /a/1.txt /a/1.c
[root@bogon ~]# ls /a
1.c b
[root@bogon ~]# ## 4.9查看空间使用情况 du
三、查看空间使用情况 du、df
选项说明:
-a :统计磁盘空间占用情况
-s :只统计每个文件的空间占用情况
-h:人类可读格式的打印尺寸(例如:1K 234M 2G)
-
df:列出文件系统的磁盘空间占用情况
使用格式为:df [-ahikHTm] [目录或文件名称] -
du:显示磁盘空间的使用量,默认情况下是以 KB 为单位
使用格式为:du [-ahskm] 文件或目录
df -h 显示磁盘空间已满,但 du -sh / 统计的大小与 df 结果不一致,可能是什么原因?如何解决
- du:显示每个文件和目录的磁盘使用空间(
du
从**文件内容**层面统计 “实际被文件占用的磁盘块”) - df-h:显示磁盘分区上磁盘分区上可以使用的磁盘空间(
df
从**文件系统**层面统计 “已分配的磁盘块”)
原因一:已删除但被进程锁定的文件
当一个文件被 rm
删除后,若仍有进程在打开 / 读写该文件(如日志文件被删除但服务未重启),文件系统不会释放其占用的磁盘空间(因为进程仍持有文件句柄)。此时:
df
会继续统计这部分 “已删除但未释放” 的空间(显示为已用);du
不会统计(因为文件的目录项已被删除,无法通过路径访问)。
排查与解决:
- 查找被删除但仍被进程占用的文件:lsof | grep deleted(安装lsof:查找所有已经删除但打开的文件)
- 释放空间
- 若进程可重启(如非关键服务):直接重启进程(
sudo systemctl restart 服务名
或kill -9 PID
),进程退出后会释放文件句柄,空间自动回收。 - 若进程不可重启(如数据库):通过重定向清空文件(无需删除,直接覆盖内容)
- 若进程可重启(如非关键服务):直接重启进程(
原因二:挂载点被覆盖(隐藏的文件)
若在一个非空目录下挂载了另一个文件系统(如 mount /dev/sdb1 /data
,而 /data
原有文件未删除),挂载后原目录的文件会被隐藏
df
统计的是挂载后的文件系统使用情况,不包含被隐藏的原文件;du -sh /
会统计根目录下所有可见文件,但被挂载点隐藏的原文件不会被统计(因为访问/data
时实际指向挂载的新文件系统)
排查与解决:
-
列出所有挂载点,找到可能的覆盖目录:mount | grep -v ‘^/dev/loop’ # 显示系统中已挂载的文件系统,但排除掉以
/dev/loop
开头的设备(临时镜像,重点看本地磁盘挂载)-v
是grep
的选项,表示 “反向匹配”(即排除符合模式的行,只保留不匹配的行)'^/dev/loop'
是匹配模式,其中^
是正则表达式中的特殊符号,表示 “行的开头”。因此,这个模式的含义是 “匹配所有以/dev/loop
开头的行”
-
卸载挂载点后,原目录的文件会显现,此时用
du
统计umount /挂载点 # 如 umount /data du -sh /挂载点 # 此时可看到原目录下被隐藏的文件大小
-
删除原目录下不需要的文件后,重新挂载
rm -rf /挂载点/无用文件
mount /挂载点
四、压缩和解压缩
在Linux中,压缩文件的命令有以下几种:
-
zip,对应的解压命令为 unzip
-
gzip,对应解压命令为 gunzip
-
bzip2,它对应的解压命令为 bunzip2
五、文件归档 tar
tar 通常用于将多个文件和目录打包成一个归档文件
tar [options] -f archive.tar [files...]
# -f archive.tar:指定归档文件的名称
选项说明:
-f:等价于 --file=ARCHIVE 选项,作用是指定归档文件(压缩文件),此选项必须放到所有选项的最后,后面必须紧跟文件名称
-c:创建一个新的归档文件(压缩文件)
-t:以列表的方式显示归档文件(压缩文件)中的内容
-z:使用 gzip 压缩归档文件
-j:使用 bzip2 压缩归档文件
-J:使用 xz 压缩归档文件
-x:解压归档文件
-p:保留文件的原始权限(解压时)
-r:向现有归档文件中追加文件
-u:仅追加比归档文件中已有文件更新的文件
-v:等价于 --verbose,显示详细操作过程
-d:找到归档文件中与文件系统不同步的差异
-A:将一个 .tar 文件追加到另一个 .tar 文件中
-C < directory > :切换到指定目录进行操作
- 创建归档文件( -c )
- 解压归档文件( -x )
- 压缩归档文件( -c、-z/j/J )
- 列出归档文件中的内容( -t )
- 追加文件到已存在的归档中( -r )
# 1、创建归档文件:将文件 file1、file2 和 directory 打包到一个名为 archive.tar 的归档文件中
tar -cvf archive.tar file1 file2 directory
-c: 创建新的归档文件
-v: 显示详细输出,列出被添加到归档中的文件
-f: 指定归档文件的名称# 2、解压归档文件:解压名为 archive.tar 的归档文件,还原其中包含的文件和目录
tar -xvf archive.tar
-x: 解压归档文件
-v: 显示详细输出,列出被解压的文件
-f: 指定要解压的归档文件的名称# 3、压缩归档文件:将名为 directory 的目录打包成一个归档文件,然后使用 gzip 进行压缩,生成名为 archive.tar.gz 的文件
tar -czvf archive.tar.gz directory
-c: 创建新的归档文件
-z: 使用 gzip 压缩归档文件
-v: 显示详细输出,列出被添加到归档中的文件
-f: 指定归档文件的名称# 4、列出归档文件中的内容:列出名为 archive.tar 的归档文件中包含的所有文件和目录
tar -tvf archive.tar
-t: 列出归档文件中的内容
-v: 显示详细输出,列出归档文件中的所有文件和目录
-f: 指定要列出内容的归档文件的名称# 5、追加文件到已存在的归档中:将名为 newfile 的文件添加到已存在的名为 archive.tar 的归档文件中
tar -rvf archive.tar newfile
-r: 向已存在的归档中追加文件
-v: 显示详细输出,列出被添加到归档中的文件
-f: 指定已存在的归档文件的名称# 6、创建一个经过 gzip 压缩的归档文件:打包 directory 目录下的所有文件和子目录,并使用 gzip 压缩,生成名为 archive.tar.gz 的归档文件
tar -zcvf archive.tar.gz directory
-z: 表示要使用 gzip 进行压缩。
-c: 表示创建新的归档文件。
-v: 表示详细输出,列出被添加到归档中的文件。
-f archive.tar.gz: 指定归档文件的名称为 archive.tar.gz。# 7、解压一个已经被 gzip 压缩的归档文件:解压 example.tar.gz 文件,并在当前目录下恢复其中包含的文件和目录
tar -zxvf example.tar.gz
-z: 表示要使用 gzip 解压归档文件。
-x: 表示解压操作。
-v: 表示详细输出,列出被解压的文件。
-f example.tar.gz: 指定要解压的归档文件的名称为 example.tar.gz