跳转到内容

Linux 目录结构详解 | 文件系统布局与路径管理完全指南

Linux Directory Structure

Linux 的目录结构为树状结构,最顶级的目录为根目录 /。与其他操作系统(如 Windows)不同,Linux 采用单一的文件系统层次结构标准(FHS),所有文件和目录都从根目录开始。

其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除他们。理解 Linux 目录结构是掌握 Linux 系统管理的基础。

Linux 文件系统层次结构标准(FHS)

核心目录说明

目录用途说明重要程度
/根目录,所有目录的起点⭐⭐⭐⭐⭐
/bin基本用户命令二进制文件⭐⭐⭐⭐⭐
/boot引导加载程序文件⭐⭐⭐⭐
/dev设备文件⭐⭐⭐⭐⭐
/etc主机特定的系统配置文件⭐⭐⭐⭐⭐
/home用户主目录⭐⭐⭐⭐⭐
/lib共享库文件⭐⭐⭐⭐
/media可移动媒体设备的挂载点⭐⭐⭐
/mnt临时挂载文件系统⭐⭐⭐
/opt附加应用程序软件包⭐⭐⭐
/proc虚拟文件系统,进程和内核信息⭐⭐⭐⭐
/rootroot 用户的主目录⭐⭐⭐⭐
/sbin系统管理命令二进制文件⭐⭐⭐⭐
/tmp临时文件⭐⭐⭐
/usr次要层次结构,用户程序⭐⭐⭐⭐⭐
/var可变数据文件⭐⭐⭐⭐

重要子目录详解

/etc - 配置文件中心

bash
# 查看系统配置文件
ls /etc/

# 常见配置文件
/etc/passwd      # 用户账户信息
/etc/shadow      # 用户密码信息
/etc/group       # 用户组信息
/etc/fstab       # 文件系统表
/etc/hosts       # 主机名解析
/etc/resolv.conf # DNS 配置
/etc/ssh/        # SSH 配置

/var - 可变数据

bash
# 日志文件
/var/log/         # 系统日志
/var/log/syslog   # 系统日志(Debian/Ubuntu)
/var/log/messages # 系统日志(CentOS/RHEL)

# 其他可变数据
/var/spool/       # 假脱机数据
/var/tmp/         # 重启后保留的临时文件
/var/lib/         # 应用程序状态信息

/usr - 用户程序

bash
/usr/bin/         # 用户命令
/usr/sbin/        # 系统管理命令
/usr/local/       # 本地安装的软件
/usr/share/       # 共享数据
/usr/include/     # C 头文件
/usr/lib/         # 库文件

绝对路径与相对路径

绝对路径相对路径
由根目录 / 写起,例如:/usr/share/doc 这个目录。不是由 / 写起,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成:cd ../man 这就是相对路径的写法。

路径示例对比

bash
# 绝对路径示例(从根目录开始)
/home/user/documents/file.txt
/usr/local/bin/python3
/etc/nginx/nginx.conf

# 相对路径示例(相对于当前目录)
./file.txt           # 当前目录下的 file.txt
../parent/file.txt   # 上级目录下的 file.txt
../../grandparent/   # 上两级目录
documents/report.pdf # 当前目录下 documents 文件夹中的 report.pdf

特殊路径符号

符号含义示例
.当前目录./script.sh
..上级目录cd ..
~用户主目录cd ~
-上一个工作目录cd -

查看目录

Linux 系统当中, ls 命令可能是最常被运行的。

ls查看当前路径下的文件名称
ls -a全部的文件,连同隐藏文件(开头为 . 的文件) 一起列出来(常用)
ls -d仅列出目录本身,而不是列出目录内的文件数据(常用)
ls -l长数据串列出,包含文件的属性与权限等等数据;(常用)
ll等于 ls -l
ls -al目录下的所有文件列出来(含属性与隐藏档)

ls 命令高级用法

bash
# 基本用法
ls                    # 列出当前目录内容
ls /etc              # 列出指定目录内容

# 显示详细信息
ls -l                # 长格式显示(权限、所有者、大小、时间)
ls -lh               # 人类可读的文件大小(KB, MB, GB)

# 显示隐藏文件
ls -a                # 显示所有文件(包括以.开头的隐藏文件)
ls -la               # 显示所有文件的详细信息

# 排序选项
ls -lt               # 按修改时间排序(最新的在前)
ls -ltr              # 按修改时间排序(最旧的在前)
ls -lS               # 按文件大小排序
ls -lrS              # 按文件大小反向排序

# 递归显示
ls -R                # 递归显示子目录

# 组合使用
ls -lah              # 详细列表 + 人类可读大小 + 显示隐藏文件
ls -lt --time-style=long-iso  # 按时间排序,ISO 格式时间

ls 输出解读

bash
$ ls -lh
total 16K
drwxr-xr-x 2 user group 4.0K Jan 15 10:30 Documents
-rw-r--r-- 1 user group 1.2K Jan 15 09:45 README.md
-rwxr-xr-x 1 user group  512 Jan 14 16:20 script.sh

字段说明:

  1. 文件类型和权限drwxr-xr-x
    • 第1位:文件类型(d=目录,-=文件,l=链接)
    • 2-4位:所有者权限(rwx)
    • 5-7位:组权限(r-x)
    • 8-10位:其他用户权限(r-x)
  2. 硬链接数2
  3. 所有者user
  4. 所属组group
  5. 文件大小4.0K
  6. 修改时间Jan 15 10:30
  7. 文件名Documents

切换目录

cdChange Directory 的缩写,这是用来变换工作目录的命令。

bash
cd \[相对路径或绝对路径\]

cd 命令实用技巧

bash
# 切换到指定目录
cd /usr/local/bin        # 绝对路径
cd ../documents          # 相对路径

# 快捷方式
cd ~                     # 切换到用户主目录
cd                       # 同上(不带参数)
cd -                     # 切换到上一个工作目录
cd ..                    # 切换到上级目录
cd ../..                 # 切换到上两级目录
cd /                     # 切换到根目录

# 使用 Tab 补全
cd /us<Tab>loc<Tab>bin   # 自动补全路径

# 使用变量
cd $HOME                 # 切换到主目录
cd $OLDPWD               # 切换到上一个目录

目录导航最佳实践

bash
# 1. 使用 pushd/popd 管理目录栈
pushd /var/log           # 进入目录并压入栈
pushd /etc/nginx         # 进入另一个目录
popd                     # 返回上一个目录

# 2. 创建目录别名
alias cdlog='cd /var/log'
alias cdetc='cd /etc'

# 3. 使用 CDPATH 环境变量
export CDPATH=".:~:/usr:/etc"
cd nginx                 # 会自动在 CDPATH 中查找

显示当前目录

pwdPrint Working Directory 的缩写,也就是显示目前所在目录的命令。

bash
# 基本用法
pwd                      # 显示当前工作目录

# 显示物理路径(解析符号链接)
pwd -P

# 示例输出
$ pwd
/home/user/projects

$ pwd -P
/home/user/real-projects  # 如果当前目录是符号链接

pwd 与 PWD 变量

bash
# shell 内置变量
echo $PWD                # 当前目录
echo $OLDPWD             # 上一个目录

# 在脚本中使用
CURRENT_DIR=$(pwd)
echo "Working in: $CURRENT_DIR"

创建目录

mkdir(make directory) 用来创建新的目录。

bash
mkdir \[-mp\] 目录名称
\-m配置文件的权限,直接配置,不需要看默认权限的脸色
\-p直接将所需要的目录(包含上一级目录) 递归创建起来!
mkdir --help查看帮助

mkdir 命令详解

bash
# 创建单个目录
mkdir new_folder

# 创建多个目录
mkdir dir1 dir2 dir3

# 递归创建多级目录
mkdir -p parent/child/grandchild

# 创建目录并设置权限
mkdir -m 755 secure_dir
mkdir -m 700 private_dir

# 创建目录并显示过程
mkdir -v new_directory

# 组合使用
mkdir -pv projects/{src,docs,tests}/{frontend,backend}

实际应用场景

bash
# 1. 创建项目结构
mkdir -p myproject/{src,lib,tests,docs,build}

# 2. 创建带权限的目录
mkdir -m 700 ~/.ssh
mkdir -m 755 /var/www/html

# 3. 批量创建日期目录
mkdir -p logs/$(date +%Y)/$(date +%m)/$(date +%d)

# 4. 创建嵌套的项目结构
mkdir -p project/{frontend/{src,public},backend/{app,config},tests}

删除目录

rmdir 用来删除空的目录命令。

bash
rmdir \[-p\] 目录名称
\-p连同上一级 \[空的\] 目录也一起删除

rmdir 与 rm 的区别

bash
# rmdir - 只能删除空目录
rmdir empty_dir

# rm - 可以删除非空目录(危险!)
rm -r directory_name      # 递归删除
rm -rf directory_name     # 强制递归删除(谨慎使用!)

安全删除目录的最佳实践

bash
# 1. 先确认目录内容
ls -la directory_name/

# 2. 使用交互式删除
rm -ri directory_name/    # 每个文件都询问

# 3. 先移动到临时位置
mv directory_name /tmp/
# 确认无误后再删除
rm -rf /tmp/directory_name

# 4. 使用 trash-cli(更安全)
trash-put directory_name  # 移动到回收站

rmdir 递归删除示例

bash
# 创建测试目录结构
mkdir -p a/b/c/d/e

# 尝试删除(会失败,因为非空)
rmdir a
# rmdir: failed to remove 'a': Directory not empty

# 从最内层开始删除
rmdir a/b/c/d/e
rmdir a/b/c/d
rmdir a/b/c
rmdir a/b
rmdir a

# 或者使用 -p 选项
rmdir -p a/b/c/d/e  # 一次性删除所有空目录

高级目录操作技巧

1. 查找大目录

bash
# 查找大于 100MB 的目录
du -h --max-depth=1 / | sort -hr | head -20

# 查看当前目录下各子目录大小
du -sh */

# 查找最大的 10 个目录
du -ah /home | sort -rh | head -10

2. 目录权限管理

bash
# 查看目录权限
ls -ld /etc

# 修改目录权限
chmod 755 directory
chmod -R 755 directory  # 递归修改

# 修改目录所有者
chown user:group directory
chown -R user:group directory

3. 目录监控

bash
# 实时监控目录变化
watch -n 1 'ls -la /path/to/dir'

# 使用 inotifywait(需要安装 inotify-tools)
inotifywait -m /path/to/dir -e create -e delete -e modify

4. 目录比较

bash
# 比较两个目录的差异
diff -rq dir1/ dir2/

# 同步两个目录
rsync -av dir1/ dir2/

常见问题排查

问题 1:权限不足

bash
# 错误:Permission denied
mkdir /root/test

# 解决:使用 sudo
sudo mkdir /root/test

# 或者修改目录权限
sudo chown $USER:$USER /target/directory

问题 2:目录不为空

bash
# 错误:Directory not empty
rmdir non_empty_dir

# 解决:先清空目录
rm -rf non_empty_dir/*
rmdir non_empty_dir

# 或者直接删除
rm -rf non_empty_dir

问题 3:路径过长

bash
# 错误:File name too long

# 解决:使用相对路径
cd /very/long/path
ln -s . short_link

# 或者使用变量
LONG_PATH="/very/long/path/to/somewhere"
cd "$LONG_PATH"

问题 4:符号链接混乱

bash
# 查看符号链接
ls -la link_name

# 解析符号链接
readlink -f link_name

# 删除符号链接(不删除目标)
unlink link_name
rm link_name

目录操作最佳实践

1. 使用引号处理特殊字符

bash
# 不好的做法
cd My Documents      # 会被解析为两个参数

# 好的做法
cd "My Documents"
cd My\ Documents
cd 'My Documents'

2. 避免在根目录执行危险操作

bash
# ❌ 极度危险!
rm -rf /
rm -rf /*

# ✅ 安全的做法
rm -rf ./directory_name  # 明确指定相对路径

3. 定期清理临时目录

bash
# 清理 /tmp 目录(7天前的文件)
find /tmp -type f -mtime +7 -delete

# 清理用户临时文件
rm -rf ~/.cache/thumbnails/*

4. 备份重要目录

bash
# 使用 tar 备份
tar -czf backup_$(date +%Y%m%d).tar.gz important_dir/

# 使用 rsync 同步备份
rsync -av important_dir/ backup_location/

总结

掌握 Linux 目录结构对于系统管理至关重要:

  1. 理解 FHS 标准:知道每个目录的用途
  2. 熟练使用路径:绝对路径和相对路径灵活运用
  3. 掌握核心命令:ls、cd、pwd、mkdir、rmdir
  4. 注意安全操作:谨慎使用 rm -rf
  5. 善用高级技巧:Tab 补全、目录栈、权限管理

关键命令速查:

bash
ls -lah              # 详细列出所有文件
cd ~/projects        # 切换到主目录下的 projects
pwd                  # 显示当前目录
mkdir -p a/b/c       # 递归创建目录
rmdir -p a/b/c       # 递归删除空目录

下一步学习:

理解目录结构是成为 Linux 高手的第一步!🚀