Linux教程 / 第 30 节
第3章:文件与目录基本操作
掌握文件和目录的创建、删除、复制、移动等核心操作
本章目标
- 掌握创建文件和目录的方法
- 学会删除文件和目录
- 熟练使用复制和移动命令
- 掌握查看文件内容的多种方式
- 能够高效管理项目文件结构
3.1 创建文件和目录
3.1.1 创建文件 (touch)
touch命令用于创建空文件或更新文件时间戳。
# 创建单个文件
touch file.txt
# 创建多个文件
touch file1.txt file2.txt file3.txt
# 批量创建文件
touch file{1..10}.txt
# 创建: file1.txt, file2.txt, ..., file10.txt
touch test{A..E}.txt
# 创建: testA.txt, testB.txt, testC.txt, testD.txt, testE.txt
# 创建带路径的文件
touch /tmp/test.txt
touch ~/documents/report.txt
更新文件时间戳
# 更新访问时间和修改时间为当前时间
touch existing-file.txt
# 只更新访问时间
touch -a file.txt
# 只更新修改时间
touch -m file.txt
# 设置指定时间
touch -t 202601131200 file.txt # YYYYMMDDhhmm
其他创建文件的方法
# 使用重定向创建文件
echo "Hello World" > file.txt
> empty-file.txt # 创建空文件
# 使用cat创建文件
cat > file.txt << EOF
Line 1
Line 2
Line 3
EOF
# 使用编辑器创建
vim newfile.txt
nano newfile.txt
3.1.2 创建目录 (mkdir)
mkdir = Make Directory
# 创建单个目录
mkdir my-folder
# 创建多个目录
mkdir folder1 folder2 folder3
# 批量创建目录
mkdir dir{1..5}
# 创建: dir1, dir2, dir3, dir4, dir5
# 创建多级目录 (-p: parent)
mkdir -p projects/web-app/src/components
# 自动创建所有不存在的父目录
# 创建目录并设置权限
mkdir -m 755 public-folder
mkdir -m 700 private-folder
# 显示创建过程 (-v: verbose)
mkdir -v test-folder
# 输出: mkdir: created directory 'test-folder'
实用示例
# 创建项目结构
mkdir -p my-project/{src,config,logs,docs}
# 创建:
# my-project/
# ├── src/
# ├── config/
# ├── logs/
# └── docs/
# 创建更复杂的结构
mkdir -p project/{src/{controllers,models,views},config,public/{css,js,images}}
3.2 删除文件和目录
3.2.1 删除文件 (rm)
rm = Remove
# 删除单个文件
rm file.txt
# 删除多个文件
rm file1.txt file2.txt file3.txt
# 使用通配符删除
rm *.txt # 删除所有.txt文件
rm test* # 删除所有test开头的文件
# 强制删除 (-f: force,不提示确认)
rm -f file.txt
# 交互式删除 (-i: interactive,每个文件都确认)
rm -i file.txt
# 输出: rm: remove regular file 'file.txt'? y
# 显示删除过程 (-v: verbose)
rm -v file.txt
# 输出: removed 'file.txt'
⚠️ 重要警告
# ❌ 危险命令,永久删除所有文件!
rm -rf /
# ❌ 危险命令,删除当前目录所有内容!
rm -rf *
# ❌ 危险命令,删除家目录所有内容!
rm -rf ~/*
# ✅ 安全做法: 先用ls确认
ls *.txt
rm *.txt
3.2.2 删除目录 (rmdir / rm -r)
rmdir = Remove Directory (只能删除空目录)
# 删除空目录
rmdir empty-folder
# 删除多个空目录
rmdir folder1 folder2
# 删除多级空目录 (-p)
rmdir -p dir1/dir2/dir3
rm -r (递归删除,可删除非空目录)
# 递归删除目录及其内容 (-r: recursive)
rm -r folder
# 强制递归删除 (-rf)
rm -rf folder
# 交互式递归删除
rm -ri folder
# 显示删除过程
rm -rv folder
安全删除建议
# 1. 先查看要删除的内容
ls -la folder/
# 2. 使用-i选项确认
rm -ri folder/
# 3. 或先移动到临时目录
mv folder /tmp/
# 确认无误后再删除
rm -rf /tmp/folder
# 4. 使用trash-cli (可恢复)
sudo apt install trash-cli
trash folder # 移到回收站,可恢复
trash-list # 查看回收站
trash-restore # 恢复文件
3.3 复制文件和目录
3.3.1 复制文件 (cp)
cp = Copy
# 复制文件
cp source.txt destination.txt
# 复制到指定目录
cp file.txt /tmp/
cp file.txt ~/documents/
# 复制多个文件到目录
cp file1.txt file2.txt file3.txt /tmp/
# 使用通配符复制
cp *.txt /backup/
cp test* /tmp/
# 保留文件属性 (-p: preserve)
cp -p file.txt backup.txt
# 保留: 修改时间、访问时间、权限、所有者
# 交互式复制 (-i: interactive)
cp -i file.txt existing-file.txt
# 输出: cp: overwrite 'existing-file.txt'? y
# 强制覆盖 (-f: force)
cp -f file.txt existing-file.txt
# 显示复制过程 (-v: verbose)
cp -v file.txt backup.txt
# 输出: 'file.txt' -> 'backup.txt'
3.3.2 复制目录 (cp -r)
# 递归复制目录 (-r: recursive)
cp -r folder backup-folder
# 复制目录到指定位置
cp -r project /backup/
# 保留属性递归复制
cp -rp folder backup-folder
# 复制时显示进度
cp -rv folder backup-folder
# 只复制更新的文件 (-u: update)
cp -ru source/ destination/
# 创建硬链接而不是复制 (-l: link)
cp -rl folder backup-folder
# 创建符号链接 (-s: symbolic)
cp -rs folder link-folder
实用示例
# 备份配置文件
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup
# 备份整个目录
cp -rp ~/projects ~/projects-backup-$(date +%Y%m%d)
# 复制并重命名
cp config.yml config.prod.yml
# 批量备份
for file in *.conf; do
cp "$file" "$file.backup"
done
3.4 移动和重命名
3.4.1 移动文件 (mv)
mv = Move
# 移动文件
mv file.txt /tmp/
# 移动多个文件
mv file1.txt file2.txt file3.txt /tmp/
# 使用通配符移动
mv *.txt /backup/
mv test* /tmp/
# 移动目录
mv folder /tmp/
# 交互式移动 (-i)
mv -i file.txt /tmp/existing-file.txt
# 输出: mv: overwrite '/tmp/existing-file.txt'? y
# 强制移动 (-f)
mv -f file.txt /tmp/
# 显示移动过程 (-v)
mv -v file.txt /tmp/
# 输出: 'file.txt' -> '/tmp/file.txt'
# 只移动更新的文件 (-u)
mv -u source/* destination/
# 不覆盖已存在的文件 (-n: no-clobber)
mv -n file.txt /tmp/
3.4.2 重命名文件 (mv)
# 重命名文件
mv old-name.txt new-name.txt
# 重命名目录
mv old-folder new-folder
# 批量重命名 (使用rename命令)
# Ubuntu/Debian
rename 's/\.txt$/\.md/' *.txt
# 将所有.txt改为.md
# 或使用循环
for file in *.txt; do
mv "$file" "${file%.txt}.md"
done
mv vs cp
| 特性 | mv | cp |
|---|---|---|
| 原文件 | 删除 | 保留 |
| 速度 | 快(同分区只改元数据) | 慢(复制数据) |
| 磁盘空间 | 不占用额外空间 | 占用双倍空间 |
| 用途 | 移动、重命名 | 备份、复制 |
3.5 查看文件内容
3.5.1 cat - 查看整个文件
cat = Concatenate
# 查看文件内容
cat file.txt
# 查看多个文件
cat file1.txt file2.txt
# 显示行号 (-n: number)
cat -n file.txt
# 显示非空行行号 (-b)
cat -b file.txt
# 显示特殊字符 (-A)
cat -A file.txt
# $ = 行尾, ^I = Tab
# 合并文件
cat file1.txt file2.txt > merged.txt
# 追加内容
cat additional.txt >> existing.txt
# 创建文件
cat > newfile.txt << EOF
Line 1
Line 2
EOF
3.5.2 less / more - 分页查看
less (推荐,功能更强)
# 分页查看文件
less file.txt
# 常用快捷键:
# 空格键 / f - 下一页
# b - 上一页
# /keyword - 向下搜索
# ?keyword - 向上搜索
# n - 下一个搜索结果
# N - 上一个搜索结果
# g - 跳到文件开头
# G - 跳到文件末尾
# q - 退出
# 显示行号
less -N file.txt
# 不换行显示长行
less -S file.txt
more (较老,功能较少)
# 分页查看
more file.txt
# 空格键 - 下一页
# Enter - 下一行
# q - 退出
3.5.3 head / tail - 查看文件头尾
head - 查看文件开头
# 查看前10行 (默认)
head file.txt
# 查看前20行
head -n 20 file.txt
# 或
head -20 file.txt
# 查看前100字节
head -c 100 file.txt
# 查看多个文件
head file1.txt file2.txt
tail - 查看文件末尾
# 查看后10行 (默认)
tail file.txt
# 查看后20行
tail -n 20 file.txt
# 或
tail -20 file.txt
# 实时查看文件更新 (-f: follow)
tail -f /var/log/syslog
# 常用于查看日志,Ctrl+C退出
# 从第100行开始显示
tail -n +100 file.txt
# 实时查看并显示文件名
tail -f -v /var/log/*.log
实用示例
# 查看日志的最后100行
tail -100 /var/log/syslog
# 实时监控多个日志文件
tail -f /var/log/nginx/access.log /var/log/nginx/error.log
# 查看文件的中间部分 (第11-20行)
head -20 file.txt | tail -10
# 查看最新的错误日志
tail -f /var/log/app.log | grep ERROR
3.5.4 其他查看命令
wc - 统计文件
# 统计行数、单词数、字节数
wc file.txt
# 输出: 100 500 3000 file.txt
# 行数 单词 字节
# 只统计行数 (-l: lines)
wc -l file.txt
# 只统计单词数 (-w: words)
wc -w file.txt
# 只统计字节数 (-c: bytes)
wc -c file.txt
# 只统计字符数 (-m: characters)
wc -m file.txt
file - 查看文件类型
# 查看文件类型
file file.txt
# 输出: file.txt: ASCII text
file image.jpg
# 输出: image.jpg: JPEG image data
file script.sh
# 输出: script.sh: Bash script, ASCII text executable
file /bin/ls
# 输出: /bin/ls: ELF 64-bit LSB executable
3.6 实战场景:整理项目目录结构
场景描述
你的项目文件很混乱,需要重新整理目录结构,创建规范的项目布局。
实战步骤
1. 查看当前状态
# 进入项目目录
cd ~/projects/messy-project
# 查看当前文件
ls -la
# 输出: 一堆混乱的文件
# app.js, config.yml, test.js, data.json, style.css, ...
2. 创建规范的目录结构
# 创建标准项目结构
mkdir -p {src,config,public,tests,docs,logs}
mkdir -p src/{controllers,models,views,utils}
mkdir -p public/{css,js,images}
# 验证创建结果
ls -l
# 输出:
# drwxr-xr-x 2 jack jack 4096 Jan 13 10:00 config
# drwxr-xr-x 2 jack jack 4096 Jan 13 10:00 docs
# drwxr-xr-x 2 jack jack 4096 Jan 13 10:00 logs
# drwxr-xr-x 5 jack jack 4096 Jan 13 10:00 public
# drwxr-xr-x 5 jack jack 4096 Jan 13 10:00 src
# drwxr-xr-x 2 jack jack 4096 Jan 13 10:00 tests
3. 移动文件到对应目录
# 移动配置文件
mv *.yml config/
mv *.json config/
# 移动源代码文件
mv app.js src/
mv *Controller.js src/controllers/
mv *Model.js src/models/
# 移动样式和脚本
mv *.css public/css/
mv *.js public/js/
mv *.png *.jpg public/images/
# 移动测试文件
mv *test.js tests/
mv *spec.js tests/
# 移动文档
mv *.md docs/
4. 创建必要的文件
# 创建README
cat > README.md << EOF
# My Project
## 项目结构
\`\`\`
.
├── src/ # 源代码
├── config/ # 配置文件
├── public/ # 静态资源
├── tests/ # 测试文件
├── docs/ # 文档
└── logs/ # 日志文件
\`\`\`
EOF
# 创建.gitignore
cat > .gitignore << EOF
node_modules/
logs/
*.log
.env
.DS_Store
EOF
# 创建空的日志文件
touch logs/app.log
touch logs/error.log
5. 备份原始文件
# 创建备份目录
mkdir -p ../backup/messy-project-$(date +%Y%m%d)
# 复制整个项目
cp -rp . ../backup/messy-project-$(date +%Y%m%d)/
# 验证备份
ls -l ../backup/
6. 清理临时文件
# 删除临时文件
rm -f *.tmp
rm -f *.bak
rm -rf temp/
# 删除空目录
find . -type d -empty -delete
7. 验证最终结构
# 查看目录树
tree -L 2
# 输出:
# .
# ├── README.md
# ├── .gitignore
# ├── config/
# │ ├── app.yml
# │ └── database.json
# ├── docs/
# │ └── API.md
# ├── logs/
# │ ├── app.log
# │ └── error.log
# ├── public/
# │ ├── css/
# │ ├── js/
# │ └── images/
# ├── src/
# │ ├── controllers/
# │ ├── models/
# │ ├── views/
# │ └── utils/
# └── tests/
# └── app.test.js
# 统计文件数量
find . -type f | wc -l
# 查看目录大小
du -sh *
3.7 常用命令速查
| 命令 | 说明 | 示例 |
|---|---|---|
touch | 创建文件 | touch file.txt |
mkdir | 创建目录 | mkdir folder |
mkdir -p | 创建多级目录 | mkdir -p a/b/c |
rm | 删除文件 | rm file.txt |
rm -r | 删除目录 | rm -r folder |
rm -rf | 强制删除 | rm -rf folder |
cp | 复制文件 | cp src dst |
cp -r | 复制目录 | cp -r src dst |
mv | 移动/重命名 | mv old new |
cat | 查看文件 | cat file.txt |
less | 分页查看 | less file.txt |
head | 查看文件头 | head -20 file.txt |
tail | 查看文件尾 | tail -f log.txt |
wc | 统计文件 | wc -l file.txt |
3.8 常见问题与解决
Q1: 如何批量创建文件?
# 方法1: 使用花括号展开
touch file{1..100}.txt
# 方法2: 使用循环
for i in {1..100}; do
touch file$i.txt
done
# 方法3: 使用seq
for i in $(seq 1 100); do
touch file$i.txt
done
Q2: 如何安全地删除文件?
# 方法1: 使用-i选项确认
rm -i file.txt
# 方法2: 先移动到临时目录
mv file.txt /tmp/
# 确认后再删除
# 方法3: 使用trash-cli
trash file.txt # 可恢复
Q3: 如何复制时保留所有属性?
# 使用-a选项 (archive)
cp -a source destination
# 等同于
cp -dpR source destination
# 或使用rsync
rsync -av source/ destination/
Q4: 如何查看大文件?
# 使用less (推荐)
less large-file.txt
# 查看前100行
head -100 large-file.txt
# 查看后100行
tail -100 large-file.txt
# 查看特定行范围 (第1000-1100行)
sed -n '1000,1100p' large-file.txt
Q5: 如何批量重命名文件?
# 方法1: 使用rename命令
rename 's/old/new/' *.txt
# 方法2: 使用循环
for file in *.txt; do
mv "$file" "${file%.txt}.md"
done
# 方法3: 添加前缀
for file in *.txt; do
mv "$file" "prefix-$file"
done
3.9 本章小结
本章学习了文件和目录的基本操作:
✅ 创建: touch创建文件,mkdir创建目录
✅ 删除: rm删除文件,rm -r删除目录
✅ 复制: cp复制文件,cp -r复制目录
✅ 移动: mv移动和重命名文件
✅ 查看: cat、less、head、tail查看文件内容
✅ 实战: 整理项目目录结构
关键要点
- 使用
mkdir -p创建多级目录 - 删除前务必确认,避免使用
rm -rf /等危险命令 cp保留原文件,mv删除原文件less比more功能更强大tail -f实时查看日志文件
下一步学习
- 第4章: 文件查找与搜索 - 学习find和grep命令
3.10 练习题
- 基础练习: 创建一个项目目录结构,包含src、config、docs三个子目录
- 进阶练习: 批量创建100个测试文件,然后批量重命名添加日期前缀
- 实战练习: 整理你的下载目录,按文件类型分类到不同文件夹
- 挑战练习: 编写脚本自动备份指定目录,保留最近7天的备份
🎉 恭喜!你已经掌握了文件和目录的基本操作!
继续学习 → 第4章:文件查找与搜索