目录操作 #

cd - 切换目录 #

基本用法 #

bash
# 切换到指定目录
$ cd /home/user/Documents

# 切换到家目录
$ cd
$ cd ~
$ cd $HOME

# 切换到上一次所在目录
$ cd -

# 切换到上级目录
$ cd ..
$ cd ../..    # 上两级目录

# 切换到当前目录
$ cd .

特殊目录 #

text
┌─────────────────────────────────────────────────────────────┐
│                      特殊目录符号                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   ~        当前用户的家目录                                   │
│   ~user    指定用户的家目录                                   │
│   -        上一次所在目录                                     │
│   .        当前目录                                          │
│   ..       上级目录                                          │
│   /        根目录                                            │
│                                                             │
└─────────────────────────────────────────────────────────────┘

实用技巧 #

bash
# 使用 Tab 补全路径
$ cd /ho<Tab>/us<Tab>/Doc<Tab>

# 使用变量
$ dir=/var/log
$ cd $dir

# 使用命令替换
$ cd $(find ~ -name "project" -type d | head -1)

# 创建并切换到目录
$ mkdir newdir && cd newdir

# 使用 CDPATH 简化切换
$ export CDPATH=/home/user/projects:/var/www
$ cd project1    # 自动在 CDPATH 中查找

目录栈 #

bash
# pushd 压入目录栈
$ pushd /var/log
/var/log ~

$ pushd /etc
/etc /var/log ~

# dirs 查看目录栈
$ dirs -v
 0  /etc
 1  /var/log
 2  ~

# popd 弹出目录栈
$ popd
/var/log ~

# 切换到栈中第 n 个目录
$ pushd +1
~ /var/log

pwd - 显示当前目录 #

基本用法 #

bash
# 显示当前目录
$ pwd
/home/user/Documents

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

# 显示逻辑路径(保留符号链接)
$ pwd -L

# 示例
$ ln -s /var/log mylog
$ cd mylog
$ pwd
/home/user/mylog
$ pwd -P
/var/log

实用场景 #

bash
# 在脚本中获取脚本所在目录
$ script_dir=$(cd "$(dirname "$0")" && pwd)

# 保存当前目录
$ current_dir=$(pwd)
$ cd /some/other/path
# ... 做一些操作
$ cd "$current_dir"

# 显示当前目录的绝对路径
$ realpath .
/home/user/Documents

mkdir - 创建目录 #

基本用法 #

bash
# 创建目录
$ mkdir newdir

# 创建多个目录
$ mkdir dir1 dir2 dir3

# 创建嵌套目录
$ mkdir -p parent/child/grandchild

# 创建时指定权限
$ mkdir -m 755 newdir
$ mkdir -m a=rwx newdir

常用选项 #

bash
# -p 创建父目录,不报错
$ mkdir -p path/to/new/directory

# -v 显示详细信息
$ mkdir -v newdir
mkdir: created directory 'newdir'

# -m 设置权限
$ mkdir -m 700 private_dir
$ mkdir -m 755 public_dir

# 组合使用
$ mkdir -pv project/{src,tests,docs}/{main,utils}

批量创建 #

bash
# 使用大括号扩展
$ mkdir project/{src,tests,docs}
# 创建 project/src, project/tests, project/docs

$ mkdir {2020..2026}/{01..12}
# 创建 2020/01 到 2026/12 的目录结构

$ mkdir dir_{a,b,c}_{1,2,3}
# 创建 dir_a_1, dir_a_2, ..., dir_c_3

# 创建项目结构
$ mkdir -p myproject/{bin,lib,src/{main,utils},tests,docs}

rmdir - 删除空目录 #

基本用法 #

bash
# 删除空目录
$ rmdir emptydir

# 删除多个空目录
$ rmdir dir1 dir2 dir3

# 删除嵌套空目录
$ rmdir -p parent/child/grandchild

常用选项 #

bash
# -p 删除父目录(如果为空)
$ rmdir -p path/to/empty/dir

# -v 显示详细信息
$ rmdir -v emptydir
rmdir: removing directory, 'emptydir'

# --ignore-fail-on-non-empty 忽略非空目录的错误
$ rmdir --ignore-fail-on-non-empty somedir

rmdir vs rm -r #

text
┌─────────────────────────────────────────────────────────────┐
│                    rmdir vs rm -r                           │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   rmdir                                                     │
│   ├── 只能删除空目录                                         │
│   ├── 更安全,不会误删文件                                   │
│   └── 适合脚本中确保目录为空                                 │
│                                                             │
│   rm -r                                                     │
│   ├── 可以删除非空目录                                       │
│   ├── 危险,可能误删重要文件                                 │
│   └── 需要谨慎使用                                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

tree - 树形显示目录 #

基本用法 #

bash
# 显示目录树
$ tree
.
├── dir1
│   ├── file1.txt
│   └── file2.txt
├── dir2
│   └── subdir
│       └── file3.txt
└── file.txt

# 显示指定目录
$ tree /home/user

# 指定深度
$ tree -L 2

# 只显示目录
$ tree -d

常用选项 #

bash
# -a 显示隐藏文件
$ tree -a

# -d 只显示目录
$ tree -d

# -L 指定深度
$ tree -L 2

# -f 显示完整路径
$ tree -f

# -p 显示权限
$ tree -p

# -u 显示所有者
$ tree -u

# -h 显示文件大小
$ tree -h

# -s 显示文件大小(字节)
$ tree -s

# -D 显示修改时间
$ tree -D

# --dirsfirst 目录在前
$ tree --dirsfirst

# -P 只显示匹配的文件
$ tree -P "*.txt"

# -I 排除匹配的文件
$ tree -I "node_modules|.git"

# 输出到文件
$ tree > directory_structure.txt

实用示例 #

bash
# 查看项目结构
$ tree -L 2 -I 'node_modules|__pycache__|*.pyc'

# 显示文件大小和权限
$ tree -hp

# 只显示目录结构
$ tree -d -L 3

# 查找特定文件
$ tree -P "*.py"

# 生成目录文档
$ tree -h --du > project_structure.md

dirname 和 basename #

dirname - 提取目录名 #

bash
# 提取目录部分
$ dirname /home/user/file.txt
/home/user

$ dirname file.txt
.

$ dirname /home/user/
/home

# 处理多个路径
$ dirname -z /path/to/file1 /path/to/file2

# 在脚本中使用
$ filepath="/home/user/documents/report.pdf"
$ dir=$(dirname "$filepath")
$ echo $dir
/home/user/documents

basename - 提取文件名 #

bash
# 提取文件名
$ basename /home/user/file.txt
file.txt

# 去除后缀
$ basename /home/user/file.txt .txt
file

$ basename file.tar.gz .tar.gz
file

# 处理多个路径
$ basename -a /path/to/file1 /path/to/file2

# 在脚本中使用
$ filepath="/home/user/documents/report.pdf"
$ filename=$(basename "$filepath")
$ echo $filename
report.pdf

$ name=$(basename "$filepath" .pdf)
$ echo $name
report

组合使用 #

bash
# 获取脚本的目录和文件名
$ script_path="/home/user/scripts/deploy.sh"
$ script_dir=$(dirname "$script_path")
$ script_name=$(basename "$script_path")

# 获取文件扩展名
$ filename="document.pdf"
$ extension="${filename##*.}"
$ echo $extension
pdf

# 获取不带扩展名的文件名
$ name="${filename%.*}"
$ echo $name
document

realpath - 获取绝对路径 #

基本用法 #

bash
# 获取绝对路径
$ realpath file.txt
/home/user/Documents/file.txt

# 解析符号链接
$ realpath symlink.txt
/home/user/original.txt

# 相对路径转绝对路径
$ realpath ../other_dir
/home/user/other_dir

# 不解析符号链接
$ realpath -s symlink.txt
/home/user/symlink.txt

常用选项 #

bash
# -s 不解析符号链接
$ realpath -s link_to_dir

# -m 如果路径不存在也不报错
$ realpath -m /nonexistent/path/to/file

# -q 静默模式
$ realpath -q nonexistent

# --relative-to=DIR 相对于指定目录
$ realpath --relative-to=/home/user /var/log
../var/log

目录大小统计 #

du - 目录磁盘使用 #

bash
# 查看目录大小
$ du
4       ./dir1
8       ./dir2
16      .

# 查看指定目录
$ du /home/user

# 人类可读格式
$ du -h
4.0K    ./dir1
8.0K    ./dir2
16K     .

# 只显示总计
$ du -sh
16K     .

# 显示所有子目录
$ du -h --max-depth=1

# 按大小排序
$ du -h | sort -h

# 查看最大的目录
$ du -h --max-depth=1 | sort -hr | head -10

# 排除特定目录
$ du -h --exclude="node_modules"
$ du -h --exclude="*.log"

# 显示文件和目录
$ du -ah

# 只显示总计
$ du -s directory/

ncdu - 交互式磁盘使用分析 #

bash
# 安装 ncdu
$ sudo apt install ncdu    # Ubuntu/Debian
$ sudo yum install ncdu    # CentOS/RHEL

# 扫描目录
$ ncdu

# 扫描指定目录
$ ncdu /home/user

# 导出报告
$ ncdu -o report.txt

# 导入报告
$ ncdu -f report.txt

# 快捷键
n    按名称排序
s    按大小排序
d    删除选中项
i    显示详细信息
q    退出

目录比较 #

diff - 比较目录 #

bash
# 比较两个目录
$ diff -r dir1/ dir2/

# 只显示文件差异
$ diff -rq dir1/ dir2/

# 显示详细差异
$ diff -ru dir1/ dir2/

# 排除特定文件
$ diff -rq --exclude="*.log" dir1/ dir2/

rsync - 同步比较 #

bash
# 干运行模式,只显示差异
$ rsync -avn dir1/ dir2/

# 显示将要传输的文件
$ rsync -avn --delete dir1/ dir2/

# 详细输出
$ rsync -avvn dir1/ dir2/

小结 #

通过本节学习,你应该掌握:

  1. cd:切换目录,目录栈操作
  2. pwd:显示当前目录
  3. mkdir:创建目录,批量创建
  4. rmdir:删除空目录
  5. tree:树形显示目录结构
  6. dirname/basename:路径分解
  7. realpath:获取绝对路径
  8. du:目录大小统计

下一步,我们将学习文件权限管理。

最后更新:2026-04-11