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

特性mvcp
原文件删除保留
速度快(同分区只改元数据)慢(复制数据)
磁盘空间不占用额外空间占用双倍空间
用途移动、重命名备份、复制

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删除原文件
  • lessmore功能更强大
  • tail -f实时查看日志文件

下一步学习

  • 第4章: 文件查找与搜索 - 学习find和grep命令

3.10 练习题

  1. 基础练习: 创建一个项目目录结构,包含src、config、docs三个子目录
  2. 进阶练习: 批量创建100个测试文件,然后批量重命名添加日期前缀
  3. 实战练习: 整理你的下载目录,按文件类型分类到不同文件夹
  4. 挑战练习: 编写脚本自动备份指定目录,保留最近7天的备份

🎉 恭喜!你已经掌握了文件和目录的基本操作!

继续学习 → 第4章:文件查找与搜索