目录操作 #
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/
小结 #
通过本节学习,你应该掌握:
- cd:切换目录,目录栈操作
- pwd:显示当前目录
- mkdir:创建目录,批量创建
- rmdir:删除空目录
- tree:树形显示目录结构
- dirname/basename:路径分解
- realpath:获取绝对路径
- du:目录大小统计
下一步,我们将学习文件权限管理。
最后更新:2026-04-11