第一部分:Linux 文件系统的哲学与基础

1.1 “一切皆文件”

在 Linux/Unix 世界中,最核心的设计哲学便是 “一切皆文件”

  • 普通文件:文本、二进制、数据。

  • 目录:特殊文件,用于存储文件名及其 inode 的映射表。

  • 设备文件:硬件设备(如 /dev/sda, /dev/null)被抽象为文件,通过读写文件来控制硬件。

  • 进程与网络:进程信息存放在 /proc,网络 socket 也通过文件描述符操作。

1.2 文件系统层次结构标准

Linux 没有 Windows 的 C盘、D盘概念,只有一个根目录 /

  • /:根目录,文件系统的起点。

  • /bin & /sbin:系统启动和基础操作所需的二进制文件。

  • /boot:内核(vmlinuz)、引导加载程序(GRUB)。

  • /dev:设备文件。

  • /etc:系统配置文件(文本文件为主,如 passwdfstab)。

  • /home:普通用户的家目录。

  • /root:超级用户的家目录。

  • /var:可变数据(日志 /var/log, 邮件 /var/mail, 缓存)。

  • /tmp:临时文件(重启通常清空)。

  • /usr:用户级应用程序和文件(类似 Windows 的 Program Files)。

  • /proc:虚拟文件系统,反映内核状态和进程信息。


第二部分:核心命令详解

2.1 目录操作

pwd (Print Working Directory)

显示当前工作目录的绝对路径。

bash

$ pwd
/home/username/Documents
cd (Change Directory)

切换目录。

bash

cd /etc          # 绝对路径
cd ../..         # 相对路径:向上两级
cd ~             # 切换到当前用户的家目录
cd -             # 切换到上一次所在的目录(相当于后退)
ls (List)

列出目录内容。这是最常用的命令之一,参数组合至关重要。

bash

ls               # 简单列出名称
ls -l            # 长格式(权限、链接数、所有者、大小、时间)
ls -a            # 显示所有文件(包括以.开头的隐藏文件)
ls -lh           # 人类可读的大小(K, M, G)
ls -ltr          # 按时间倒序排列(最新的在最后,适合看最近修改的文件)
ls -R            # 递归列出子目录
ls -i            # 显示文件的 inode 号
mkdir (Make Directory)

创建目录。

bash

mkdir dir1                       # 创建单个目录
mkdir -p project/src/utils       # 递归创建多层目录(即使父目录不存在)
mkdir -m 755 secure_dir          # 创建时直接指定权限,忽略 umask
rmdir (Remove Directory)

删除空目录。如果目录非空,会报错。通常用 rm -r 替代。

2.2 文件操作

touch
  • 如果文件不存在:创建一个空的文件。

  • 如果文件存在:更新文件的访问和修改时间戳。

bash

touch newfile.txt
touch -t 202312311200 file.txt   # 修改时间戳为 2023-12-31 12:00
cp (Copy)

bash

cp source.txt dest.txt            # 复制文件
cp -r source_dir/ dest_dir/       # 递归复制目录
cp -i file.txt /target/           # 交互模式(覆盖前询问)
cp -u source.txt dest.txt         # 更新模式(源文件更新或目标不存在时才复制)
cp -a dir1 dir2                   # 归档模式(保留权限、时间戳、递归,常用于备份)
cp -l file.txt hard_link.txt      # 创建硬链接(而非复制数据)
cp -s file.txt sym_link.txt       # 创建符号链接(软链接)
mv (Move)

移动文件或重命名。

bash

mv oldname.txt newname.txt        # 重命名
mv file.txt /some/other/path/     # 移动
mv -i source dest                 # 交互模式
rm (Remove)

删除文件或目录(危险命令)。

bash

rm file.txt                       # 删除文件
rm -f file.txt                    # 强制删除(忽略不存在的文件,不提示)
rm -r directory/                  # 递归删除目录
rm -rf directory/                 # 强制递归删除(慎用,极易误删)

安全提示:建议在 ~/.bashrc 中定义别名 alias rm='rm -i',或养成使用 trash-cli 的习惯。

2.3 查看文件内容

命令 用途 特点
cat 显示整个文件 适合小文件,大文件刷屏
tac 反向显示(从最后一行开始) 与 cat 相反
more 分页显示 空格翻页,不支持向上翻
less 更强大的分页显示 支持上下键、搜索(/关键词)、q 退出
head 显示文件开头 head -n 20 file 显示前20行
tail 显示文件结尾 tail -f file 实时跟踪日志输出(极其常用)
nl 显示行号 类似 cat -n

第三部分:深入理解文件属性与权限

3.1 文件类型与权限(ls -l 详解)

执行 ls -l 输出示例:
-rw-r--r-- 1 root root 1024 Jan 1 12:00 file.txt

第一段:文件类型
  • - :普通文件

  • d :目录

  • l :符号链接

  • b :块设备(如硬盘)

  • c :字符设备(如终端)

  • s :套接字

  • p :管道

第二段:权限位(共9位,分三组)

rw- r-- r--

  1. 所有者 (User)rw- 表示读写,无执行。

  2. 组 (Group)r-- 只读。

  3. 其他 (Other)r-- 只读。

权限数值表示(八进制)

  • r = 4

  • w = 2

  • x = 1

  • - = 0
    rwxr-xr-x = 7 (4+2+1) + 5 (4+0+1) + 5 (4+0+1) = 755

第三段:链接数
  • 对于目录:指其子目录的数量(包括 . 和 ..)。

  • 对于文件:硬链接的数量。

第四、五段:所有者和组
第六段:文件大小(默认字节)
第七至九段:修改时间
第十段:文件名

3.2 权限管理命令

chmod (Change Mode)

修改权限。

bash

# 符号模式
chmod u+x script.sh        # 给所有者增加执行权限
chmod g-w file.txt         # 剥夺组的写权限
chmod a+r readme.md        # 给所有用户(所有者、组、其他)读权限
chmod u=rwx,g=rx,o=r file

# 数字模式
chmod 755 script.sh        # 所有者全权,组和其他只读+执行
chmod 600 secret.txt       # 只有所有者可读写(常用私钥权限)
chmod -R 755 folder/       # 递归修改
chown (Change Owner)

更改文件所有者。

bash

chown user1 file.txt               # 更改所有者
chown user1:group1 file.txt        # 同时更改所有者和组
chown :group1 file.txt             # 仅更改组
chown -R user1:group1 folder/      # 递归
umask (User File Creation Mask)

决定新创建文件和目录的默认权限。

  • 公式:默认权限 = 最大值 - umask

    • 文件最大值 = 666 (默认没有执行权限,防止恶意代码)

    • 目录最大值 = 777 (需要有x权限才能进入)

  • 查看:umask (通常为 0022)

    • 022 意味着新建文件 = 666 - 022 = 644 (rw-r--r--)

    • 新建目录 = 777 - 022 = 755 (rwxr-xr-x)

3.3 特殊权限(SUID, SGID, Sticky Bit)

SUID (Set User ID)

chmod u+s file。执行文件时,进程拥有文件所有者的权限,而不是执行者的权限。典型例子:/usr/bin/passwd(普通用户执行时,临时获得 root 权限修改 /etc/shadow)。

  • 权限显示:rws (原 x 位置显示 s)。

SGID (Set Group ID)

chmod g+s file/dir

  • 作用于文件:继承文件所属组的权限。

  • 作用于目录:在该目录下新建的文件,自动继承该目录的所属组。常用于团队协作目录。

Sticky Bit

chmod +t dir。通常用于 /tmp。如果目录设置了 sticky bit,只有文件所有者、目录所有者或 root 才能删除该目录下的文件,其他人即使有写权限也不能删别人的文件。

  • 权限显示:/tmp 权限为 drwxrwxrwt


第四部分:链接(Links)

4.1 硬链接 (Hard Link)

  • 原理:多个文件名指向同一个 inode(数据块)。

  • 特点

    • 删除原文件,链接文件依然存在(因为 inode 引用计数减少,未归零)。

    • 不能跨文件系统(不能跨分区)。

    • 不能链接目录(防止循环引用)。

  • 操作ln source.txt hard_link.txt

4.2 软链接 (Symbolic Link / Soft Link)

  • 原理:相当于 Windows 的快捷方式,是一个特殊文件,内容指向目标文件的路径。

  • 特点

    • 可以跨文件系统。

    • 可以链接目录。

    • 如果原文件删除,链接文件失效(“断裂”)。

  • 操作ln -s /absolute/path/target soft_link


第五部分:文件查找与管理

5.1 find —— 最强大的查找工具

find 功能极其强大,可以按名称、时间、大小、权限、类型进行查找,并执行操作。

基本语法find [路径] [条件] [动作]

按名称查找

bash

find / -name "nginx.conf"            # 精确匹配
find /home -iname "*.jpg"            # 忽略大小写
find . -name "*.py" -type f          # 只找文件,不找目录
按大小查找

bash

find /var -size +100M                # 大于 100M
find . -size -1k                     # 小于 1KB
find . -size 0                       # 空文件
按时间查找
  • -mtime:修改时间(天)

  • -atime:访问时间

  • -ctime:状态改变时间

  • -mmin:分钟

bash

find logs -mtime +7                  # 7天前修改过的文件
find . -mtime -1                     # 最近24小时内修改
find . -mmin -30                     # 最近30分钟修改
按权限查找

bash

find . -perm 755                     # 精确权限
find . -perm -u+s                    # 查找 SUID 文件(安全审计)
执行动作(关键)

bash

find . -name "*.tmp" -delete                # 删除找到的文件
find . -name "*.log" -exec rm {} \;         # 传统执行(每匹配一个执行一次命令)
find . -name "*.jpg" -exec cp {} /backup/ \; # 复制
find . -name "*.txt" -exec grep "error" {} \; # 搜索内容
find . -name "*.sh" -exec chmod +x {} \+    # 批量加执行权限(+ 号表示合并执行,效率高)

5.2 locate

利用数据库(updatedb)快速查找,速度极快,但非实时。

bash

locate nginx.conf        # 搜素包含该字符串的路径

刚创建的文件可能需要执行 sudo updatedb 后才能被搜到。

5.3 which 与 whereis

  • which:在 $PATH 环境变量中查找可执行文件的位置。which python

  • whereis:定位二进制文件、源码和 man 手册。whereis nginx

5.4 grep (Global Regular Expression Print)

文本搜索工具,常与管道或 find 配合。

bash

grep "error" /var/log/messages        # 查找包含 error 的行
grep -r "TODO" src/                   # 递归搜索目录
grep -v "debug" log.txt               # 反向匹配(排除 debug)
grep -n "main" main.py                # 显示行号
grep -E "error|warning" log.txt       # 扩展正则(egrep)
ps aux | grep nginx                   # 查看进程并过滤

第六部分:文件系统管理与磁盘

6.1 查看磁盘空间

df (Disk Free)

查看文件系统整体磁盘使用情况。

bash

df -h                   # 人类可读(GB, MB)
df -i                   # 查看 inode 使用率(当磁盘有空间但无法创建文件时,往往是 inode 满了)
df -T                   # 显示文件系统类型(ext4, xfs, nfs)
du (Disk Usage)

查看目录或文件的大小。

bash

du -sh /home/user       # 查看总大小
du -h --max-depth=1 /   # 查看根目录下各一级目录的大小(排查磁盘爆满常用)
du -sh *                # 列出当前目录下所有文件/目录的大小并排序
du -sh * | sort -rh     # 排序显示最大的在前

6.2 磁盘与分区操作(基础)

  • lsblk:以树状结构列出所有块设备。

  • fdisk -l:查看分区表。

  • mount:挂载设备到目录。

    bash

    mount /dev/sdb1 /mnt/data
    umount /mnt/data
  • /etc/fstab:开机自动挂载配置文件。


第七部分:文件压缩与归档

7.1 tar (Tape Archive)

最通用的打包工具(通常配合压缩算法)。

参数 含义
c 创建归档
x 解压归档
v 显示详细过程
f 指定文件名
z 通过 gzip 压缩/解压 (.tar.gz)
j 通过 bzip2 压缩/解压 (.tar.bz2)
J 通过 xz 压缩/解压 (.tar.xz)

示例

bash

# 打包
tar -czvf backup.tar.gz /home/user/data

# 解包
tar -xzvf backup.tar.gz -C /target/dir

# 查看包内容(不解压)
tar -tvf backup.tar.gz

7.2 其他压缩工具

  • gzip / gunzip:单个文件压缩,后缀 .gz

  • zip / unzip:跨平台兼容性好。

    bash

    zip -r archive.zip folder/
    unzip archive.zip -d /dest/

第八部分:输入输出重定向与管道

8.1 标准流

  • stdin (0):标准输入

  • stdout (1):标准输出

  • stderr (2):标准错误

8.2 重定向操作符

bash

# 覆盖
ls > files.txt          # 标准输出覆盖到文件
ls 2> error.log         # 标准错误覆盖
ls &> output.txt        # 所有输出覆盖

# 追加
ls >> files.txt         # 追加到文件末尾

# 输入重定向
cat < file.txt          # 将文件内容作为输入

# 黑洞
command > /dev/null 2>&1   # 丢弃所有输出(静默执行)

8.3 管道 (|)

将一个命令的标准输出作为下一个命令的标准输入。

bash

ps aux | grep ssh | wc -l
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr

第九部分:高级文件管理技巧

9.1 rsync —— 远程/本地同步神器

rsync 比 scp 或 cp 更高效,支持增量传输、断点续传、权限保留。

语法rsync [选项] 源 目标

常用选项:

  • -a:归档模式(保留权限、时间戳、递归,等同于 -rlptgoD

  • -v:详细输出

  • -z:传输时压缩

  • -P:显示进度并支持断点续传

  • --delete:删除目标目录中源目录没有的文件(实现镜像同步)

  • --exclude:排除文件

bash

# 本地同步
rsync -av /source/ /dest/          # 注意结尾 / 的差异(表示同步目录内容而非目录本身)

# 远程推送
rsync -avz -e ssh local_dir/ user@remote:/backup/

# 远程拉取
rsync -avz user@remote:/data/ /local/data/

9.2 inotify 与实时监控

结合 inotify-tools(如 inotifywait)可以实现实时监控文件变化并触发脚本(常用于热加载配置、自动备份)。

bash

while inotifywait -e modify /etc/nginx/nginx.conf; do
    systemctl reload nginx
done

9.3 文件系统权限高级特性:ACL

传统的 chmod 只能控制“所有者、组、其他人”三类。ACL (Access Control List) 允许为特定用户或特定组设置权限。

bash

# 安装 acl 支持(通常默认支持)
getfacl file.txt            # 查看 ACL
setfacl -m u:username:rw file.txt   # 给特定用户读写权限
setfacl -m g:groupname:rx file.txt
setfacl -b file.txt         # 移除所有扩展 ACL

9.4 文件属性(chattr

在 ext2/ext3/ext4 文件系统上,chattr 可以设置比权限更底层的属性。

  • i (immutable):不可修改,不可删除,不可重命名(即使是 root)。chattr +i /etc/passwd

  • a (append only):只能追加写入,不能删除。常用于日志。

  • 查看:lsattr file.txt


第十部分:实战场景与故障排查

10.1 场景一:磁盘空间已满,无法写入

  1. 使用 df -h 确认哪个分区满了。

  2. 使用 du -sh /* | sort -rh 找到大目录。

  3. 进入大目录,排查大文件:

    bash

    find /var/log -type f -size +100M -exec ls -lh {} \;
  4. 处理日志:清空日志(> /var/log/large.log),不要直接 rm(若进程仍持有文件句柄,空间不会释放,需重启服务或 lsof | grep deleted 杀进程)。

10.2 场景二:删除了文件但空间未释放

  • 现象:df 显示磁盘满,du 统计总和很小。

  • 原因:某个进程正在写入该文件,虽然目录项已删除,但文件句柄未释放。

  • 解决:

    bash

    lsof | grep deleted           # 找到被删除但仍占用的文件PID
    kill -9 PID                   # 杀掉进程,空间释放
    # 或者重启对应服务

10.3 场景三:备份策略(结合 tar 与 cron)

bash

#!/bin/bash
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d)
tar -czf $BACKUP_DIR/home_$DATE.tar.gz /home
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete

写入 crontab -e0 2 * * * /root/backup.sh (每天凌晨2点执行)。

10.4 场景四:批量重命名

使用 rename 命令(Perl 版,功能强大)。

bash

# 将所有 .htm 改为 .html
rename 's/\.htm$/\.html/' *.htm

# 文件名大写转小写
rename 'y/A-Z/a-z/' *

10.5 场景五:恢复误删文件

  • 如果未覆盖:立即卸载分区(umount)或挂载为只读(mount -o remount,ro)。

  • 工具extundelete (ext3/ext4)、testdiskPhotoRec
    注意:Linux 下恢复难度大,预防胜于治疗(备份 + 版本控制)。


第十一部分:文件系统监控与调优

11.1 lsof (List Open Files)

列出当前系统打开的文件。在 Linux 中,几乎一切都是文件,因此 lsof 非常强大。

bash

lsof /path/to/file              # 查看哪个进程在使用该文件(卸载时提示设备忙很有用)
lsof -i :80                     # 查看谁在使用 80 端口
lsof -u username                # 查看某个用户打开的文件
lsof -p PID                     # 查看进程打开的文件描述符

11.2 strace

跟踪进程的系统调用和信号,用于诊断文件访问问题。

bash

strace -e openat ls              # 查看 ls 命令打开了哪些文件

第十二部分:安全与最佳实践

  1. 权限最小化原则:不要随意使用 chmod 777。通常目录 755,文件 644

  2. 敏感文件:如 SSH 私钥 (~/.ssh/id_rsa) 必须设置为 600

  3. 路径中的空格:处理包含空格的文件名时,务必使用引号或转义符 \

  4. rm 的替代方案:使用 mkdir ~/.trash 并编写脚本 trash 移动文件到该目录,定期清理。

  5. 绝对路径 vs 相对路径:在脚本中,尽量使用绝对路径,或基于 $(dirname "$0") 动态计算,避免路径错误。

  6. 文件系统选择

    • ext4:通用,稳定。

    • XFS:适合大文件、高性能(CentOS 7+ 默认)。

    • Btrfs:支持快照、校验和,适合容器化环境。


结语

Linux 文件与目录的管理不仅仅是记忆命令,更是理解数据在磁盘上的组织方式、权限模型的哲学以及各种工具组合使用的艺术。掌握上述内容,你不仅能够高效地管理个人 Linux 环境,也能胜任企业级服务器运维、故障排查和自动化脚本编写工作。

持续练习建议

  1. 在日常终端操作中,刻意避免使用图形化文件管理器。

  2. 尝试编写 Shell 脚本来自动化每日的文件整理、备份任务。

  3. 深入理解 /proc 和 /sys 这两个虚拟文件系统,它们是理解 Linux 内核行为的最佳入口。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐