Linux 文件操作

上一篇你学会了在文件系统里"走路",这一篇学怎么"动手"——复制、移动、删除文件和目录,以及查看文件内容的多种方式。这些是日常用得最多的命令。

1. cp:复制

cp 是 "copy" 的缩写。复制目录必须加 -r(recursive,递归),这是新手最常犯的错。

# cp:copy,复制文件或目录
cp hello.txt hello.bak          # 复制文件
cp hello.txt /tmp/              # 复制到 /tmp 目录(同名)
cp hello.txt /tmp/hi.txt        # 复制并改名

# 复制目录必须加 -r(recursive,递归)
cp -r myproject myproject_bak
cp -r myproject /backup/

# 常用选项
cp -i hello.txt hi.txt          # -i:目标存在时确认(interactive)
cp -v hello.txt hi.txt          # -v:显示复制过程(verbose)
cp -u hello.txt hi.txt          # -u:仅当源更新时复制(update)
cp -a mydir mydir_bak           # -a:归档模式,保留权限和时间(备份目录常用)

常用组合:备份目录用 cp -a(保留权限和时间),覆盖前想确认用 -i

2. mv:移动与重命名

mv 是 "move" 的缩写。在 Linux 里移动和重命名是同一件事——都是改路径。源和目标在同一目录就是重命名,跨目录就是移动。

# mv:move,移动或重命名(Linux 里这俩是同一个操作)
mv old.txt new.txt              # 重命名
mv file.txt /tmp/               # 移动到 /tmp
mv file.txt /tmp/rename.txt     # 移动并改名
mv dir1 dir2                    # 目录也可以直接 mv(不需要 -r)

# 选项
mv -i old.txt new.txt           # 覆盖前确认
mv -v *.log /var/log/           # 显示移动过程

# 批量重命名用 rename(Perl 风格,更强大)
rename 's/.txt/.md/' *.txt      # 把所有 .txt 改成 .md

cp 不同,mv 目录不需要 -r,因为移动目录只是改它的路径指针,不复制内容。

3. rm:删除(小心!)

rm 是 "remove" 的缩写。Linux 的 rm 没有回收站,删了就是永久删除,生产环境出过无数 rm 误删事故。请把下面几条铁律刻在脑子里:

# rm:remove,删除(警告:没有回收站,删了就没了!)
rm notes.txt                    # 删一个文件
rm a.txt b.txt c.txt            # 删多个
rm *.log                        # 删所有 .log 文件

# 删目录必须加 -r
rm -r old_project               # 递归删目录
rm -rf old_project              # -f 强制,不问就删(最危险!)
rm -i important.txt             # -i:删前确认(重要文件务必加)

# 永远、永远不要这样敲:
# rm -rf /                       # 会删掉整个系统!
# rm -rf *                       # 会删掉当前目录所有东西

# 安全习惯:
# 1. 删之前先 ls 看清楚要删什么
# 2. 重要操作用 rm -i 逐个确认
# 3. 用 mv 到 /tmp 代替 rm(/tmp 重启会清空,留后悔余地)

关于"删库跑路"的梗,说的就是 rm -rf。一个真实教训:有人在脚本里写 rm -rf "$DIR/",而 $DIR 因为某种原因为空,命令变成了 rm -rf /——直接把服务器干废。所以脚本里用 rm 前务必判断变量非空

4. 查看文件内容:cat / less / head / tail

看文件内容不要用编辑器打开,命令行有更快的方式:

# 查看文件内容的几种方式

# cat:concatenate,一次输出全部(适合小文件)
cat hello.txt
cat -n hello.txt                # -n 显示行号
cat a.txt b.txt > merged.txt    # 合并多个文件

# less:分页查看(适合大文件,按 q 退出)
less big.log
#   上下方向键 / PgUp PgDn 翻页
#   /keyword   搜索关键字(n 下一个,N 上一个)
#   g 到开头,G 到结尾
#   q 退出

# head / tail:只看开头或结尾
head -n 20 big.log              # 前 20 行
tail -n 50 big.log              # 后 50 行
tail -f app.log                 # -f:follow,实时跟随(看日志神器,Ctrl+C 退出)
tail -n 100 -f app.log          # 先看后 100 行再开始跟随

# wc:word count,统计行数、单词数
wc -l app.log                   # -l:统计行数(超常用)

记忆口诀:

5. ln:链接(软链接与硬链接)

ln 是 "link" 的缩写,用来给文件创建"另一个名字"。分两种,理解它们要涉及 inode 概念,这里先记住用法:

# ln:link,创建链接(分硬链接和软链接两种)

# 软链接(symbolic link / symlink):类似 Windows 快捷方式
ln -s /var/log/app.log ~/app-log   # -s 表示 soft
ls -l ~/app-log
# lrwxrwxrwx 1 aden aden 17 Aug 5 app-log -> /var/log/app.log
#   ^ l 表示这是个链接

# 硬链接(hard link):同一个文件的两个名字
ln data.txt data-backup.txt        # 不加 -s 是硬链接

# 区别:
# 软链接:删原文件后链接失效;可以跨文件系统、可以链目录
# 硬链接:删原文件后硬链接仍能访问(因为 inode 还在);
#        不能跨文件系统、不能硬链接目录

# 日常用软链接居多,典型场景:
ln -s /usr/bin/python3 /usr/local/bin/python   # 给命令起别名

日常 99% 用软链接(ln -s):给命令起别名、给深路径创建快捷方式、Nginx 配置里启用站点(把 sites-available 里的配置软链到 sites-enabled)都是它。

6. stat:看文件元数据

ls -l 看的是简要信息,stat 看的是完整元数据,包括三个时间:

# stat:查看文件的详细元数据(比 ls 更全)
stat hello.txt
#   File: hello.txt
#   Size: 220             Blocks: 8          IO Block: 4096   regular file
#   Device: 801h/2049d    Inode: 1234567     Links: 1
#   Access: 2024-08-05 10:00:00   读时间
#   Modify: 2024-08-05 09:30:00   内容修改时间(ls 默认显示这个)
#   Change: 2024-08-05 09:30:00   属性修改时间(如改权限)
#   Birth:  2024-08-01 14:20:00   创建时间

# touch 修改的就是 Access 和 Modify 时间
touch -t 202401010000.00 hello.txt   # 改成 2024-01-01 00:00

三个时间容易混:Access 是最后一次读时间、Modify 是内容最后修改时间(ls 默认显示这个)、Change 是属性(权限、所有者)最后修改时间。

7. 实战:搭一个本地练手目录

把这几条命令挨个敲一遍,你就基本掌握文件操作了:

小结

这一篇你学会了文件四件套:cp 复制、mv 移动/重命名、rm 删除、cat/less/head/tail 看内容,还有 ln 建链接。记住 rm -rf 是核武器,理解再按回车。下一篇我们讲 Linux 的权限模型——谁能读、谁能写、谁能执行。

← 上一篇 Linux 命令行基础

下一篇 Linux 权限管理

✈️💬