第6章:文件与目录操作
15 分钟阅读
第六章:文件与目录操作
6.1 ls 查看文件
ls 是 Linux 中最最最常用的命令,没有之一!它的作用是列出目录内容。就像 Windows 里的"打开文件夹看里面有啥",只不过你需要敲字儿。
6.1.1 ls:基本用法
| |
等等,为啥我的文件和Windows长得不一样?没有
.exe后缀?没有文件夹图标?别慌,这就是 Linux!文件名就是文件名,后缀只是习惯,不强制。
6.1.2 ls -l:详细信息
| |
让我来解释一下每个字段(以第一行为例):
drwxr-xr-x 2 user user 4096 Jan 15 10:30 documents
| 字段 | 含义 | 本例值 |
|---|---|---|
drwxr-xr-x | 文件类型和权限 | d = 目录,rwxr-xr-x = 所有者可读写执行,组可读执行,其他人可读执行 |
2 | 硬链接数 | 2 |
user | 文件所有者 | user |
user | 所属组 | user |
4096 | 文件大小(字节) | 4096(4KB) |
Jan 15 10:30 | 最后修改时间 | 1月15日 10:30 |
documents | 文件名 | documents |
小技巧:看到
-开头的是普通文件,看到d开头的是目录(directory)。这就像是文件的"身份证",一眼就能区分!
6.1.3 ls -a:显示隐藏文件
在 Linux 里,以点(.)开头的文件是隐藏文件!就像哈利·波特的隐身斗篷,平时看不见,但它们确实存在。
| |
解释一下:
.= 当前目录(current directory)..= 上级目录(parent directory).bashrc= Bash 的配置文件(隐藏的).profile= 用户环境配置(隐藏的)
隐藏文件通常是用来配置的,一般不要乱动,否则系统可能抽风!
6.1.4 ls -lh:人性化大小
ls -l 显示的文件大小是字节为单位,数字看起来很别扭。-h(human-readable)会让你看得更舒服:
| |
4.0K、8.0K、4.0K 是不是比 4096、8192 好看多了?这才叫人性化!
6.1.5 ls -R:递归显示
| |
这个命令会把你目录下的所有层级都展示出来,就像一棵树!适合在你需要了解整个项目结构时使用。
6.1.6 ls -S:按大小排序
想看看哪个文件最大?-S 按文件大小排序(从大到小):
| |
小技巧:想从小到大排序?加个
-r(reverse):
1ls -lhSr # 从小到大
6.1.7 ls -t:按时间排序
想看最近修改的文件?-t 按修改时间排序(最新的在前面):
| |
这个命令超实用!当你忘记刚才改了什么文件时,一眼就能看到最近操作的文件。
6.1.8 ls -1:单列显示
| |
这个适合在脚本里处理输出时使用,parse起来更容易!
6.2 通配符
通配符(Wildcard)是 Shell 的神器!它能让你用特殊符号匹配多个文件,不用一个一个写文件名。想象一下,你要删除所有 .log 文件,难道要写一万遍 rm file1.log file2.log ...?不存在的!
6.2.1 *:匹配任意字符
星号(*) 匹配任意长度、任意内容的字符串。
| |
记忆方法:
*就像万能钥匙,能打开任何锁!
6.2.2 ?:匹配单个字符
问号(?) 匹配恰好一个字符。
| |
⚠️ 注意:
?.txt只能匹配一个字符的文件名,比如a.txt、1.txt。它不能匹配12.txt或abc.txt!想要匹配多个字符,得用*.txt。
记忆方法:
?就像占位符,一个问号占一个字符的位置。
6.2.3 []:匹配范围内字符
方括号([]) 匹配方括号内的任意一个字符。
| |
小技巧:方括号里可以用
-表示范围,非常方便!
| |
重要提醒:通配符是"Shell"展开的,不是
ls展开的。 你敲ls *.txt时,Shell 先把它展开成ls a.txt b.txt,再交给ls执行。理解这一点,才能看懂后面几种"引号把通配符保护起来"的用法(比如ls '*.txt'会去找一个名字就叫*.txt的文件)。 另外,通配符默认不匹配隐藏文件:ls *不会显示.bashrc,要用ls .*(但这会顺带匹配.和..)或ls -A。
别用
ls的输出去写脚本。文件名里可能带空格、换行甚至特殊字符,ls | ...处理起来坑极多。脚本里遍历文件应该用 Shell 自带的通配符或find:
1 2for f in *.txt; do echo "处理 $f"; done find . -maxdepth 1 -name '*.txt' -print0 | xargs -0 ...
graph TD
A["通配符选择"] --> B["* 任意字符"]
A --> C["? 单个字符"]
A --> D["[] 范围内字符"]
B --> E["*.log → 所有.log文件"]
C --> F["?.txt → a.txt, b.txt"]
D --> G["[0-9] → 任意数字"]6.2.4 {}:生成序列
大括号({}) 不会匹配已存在的文件,而是生成序列!
| |
💡 大括号扩展原理:
{,bak}会生成两个值:空字符串和".bak"。所以document{,.bak}展开后变成document和document.bak,正好作为 mv 的源和目标!趣闻:
{}就像是"展开卡",写进去什么就展开成什么。和[]不同,[]是匹配,{}是生成!
6.3 pwd 显示当前工作目录
pwd = Print Working Directory,打印当前工作目录。简单说就是:告诉我,我现在在哪?
| |
经常有人问:“我跑这个命令的时候,当前目录是哪儿啊?"——
pwd一敲,清晰明了!
| |
6.4 cd 切换目录
cd = Change Directory,切换目录。这是 Linux 里你使用频率最高的命令之一,仅次于 ls。
6.4.1 cd /:切换到根目录
| |
根目录是 Linux 文件系统的最顶端,就像一棵大树的根。从这里出发,你可以到达任何地方!
6.4.2 cd ~:切换到用户家目录
| |
6.4.3 cd -:返回上次目录
| |
后悔药!再也不怕回不去上一个目录了!这个
-就像是浏览器的"后退"按钮!
6.4.4 cd ..:返回上级目录
| |
小技巧:想连续返回两级?没问题!
1cd ../.. # 返回上两级
6.4.5 cd ../..:返回上两级
| |
graph TD
A["/home/username/documents/projects"] --> B[".. → documents"]
A --> C["../.. → username"]
A --> D["../../.. → home"]
A --> E["../../../.. → /"]6.5 mkdir 创建目录
mkdir = Make DIRectory,创建目录(文件夹)。
6.5.1 mkdir 目录名:创建单个目录
| |
6.5.2 mkdir -p 目录/子目录:递归创建
如果目录已经存在,mkdir 会报错。加 -p(parents)可以递归创建,即父目录不存在时一并创建:
| |
这个
-p是救命选项!想象一下你要创建/home/username/projects/my-awesome-app/src/components,一层层创建得多麻烦,加个-p一步到位!
6.5.3 mkdir -v:显示创建过程
-v(verbose)会显示创建每个目录时的信息:
| |
小技巧:
-v在脚本里特别有用,能让你知道命令到底干了什么。
6.6 touch 创建空文件
touch 的本意是"触碰”,但它最常用的功能是创建空文件。
6.6.1 touch 文件名:创建空文件
| |
有趣的是,如果文件已存在,
touch不会清空它,而是更新文件的修改时间!这有时候很有用,比如你想让 Makefile 重新编译某些文件。
6.6.2 touch -d 日期:修改时间
| |
小技巧:
-d选项可以设置文件的访问时间和修改时间为指定日期,这在某些场景下很有用,比如让备份文件保持原始时间戳,或者测试脚本中模拟特定时间的文件。
6.7 cp 复制文件
cp = Copy,复制文件。谁没有过"这个文件很重要,先备份一份"的时候呢?
6.7.1 cp 源 目标:基本复制
| |
6.7.2 cp -r 目录 目标:递归复制
复制目录需要 -r(recursive)选项,否则会报错:
| |
⚠️ 目标目录"存不存在"结果完全不同(新手最容易懵的一点):
1 2 3cp -r projects/ backup/ # backup 不存在 → 生成 backup,里面是 projects 的内容 cp -r projects/ backup/ # backup 已存在 → 变成 backup/projects,多套了一层! cp -r projects/* backup/ # 只复制里面的内容,不套外层目录(注意 * 不含隐藏文件)同理,
cp file dir/和cp file dir在有些情况下也不一样:目标末尾带/时,必须是个已存在的目录,否则报错。记不住规则就把-v加上,它会打印出每一步到底写到了哪。
6.7.3 cp -i:覆盖前询问
| |
推荐把
cp -i设成别名(alias),这样默认就会询问,避免误覆盖!
6.7.4 cp -v:显示过程
| |
6.7.5 cp -p:保留属性
| |
小技巧:
-a(archive)选项相当于-dr --preserve=all,保留所有属性,非常适合备份!
备份/迁移目录请用
cp -a而不是cp -r:-r只保证"内容复制过去",但不保留权限、时间戳、属主和符号链接(符号链接会被解引用成真实文件)。把网站目录搬到新机器上,用cp -r常常导致权限全乱、软链变成实体文件,cp -a才能原样搬过去。
6.8 mv 移动和重命名
mv = Move,既能移动文件,也能重命名文件(本质上是移动到新名字)。
6.8.1 mv 源 目标:移动
| |
6.8.2 mv 旧名 新名:重命名
| |
两个要知道的细节:
mv没有"撤销",覆盖了就是覆盖了(同名文件内容直接没了)。怕手抖就mv -i或mv -n(-n表示"目标已存在就不动",永远不覆盖)。- 如果在同一个文件系统内,
mv只是改了个名字指针,瞬间完成;如果跨文件系统(比如从/home移到/data),底层其实是"复制 + 删除原文件",大文件会很慢,中途断电还可能留下半个文件。移动大数据前先确认两处在不在同一个盘(df -h 源目录 目标目录看挂载点)。
6.8.3 mv -i:覆盖前询问
和 cp 一样,mv 也有 -i 选项:
| |
graph LR
A["mv 命令"] --> B["同一目录 → 重命名"]
A --> C["不同目录 → 移动"]
B --> D["mv a.txt b.txt"]
C --> E["mv a.txt /path/to/b.txt"]6.9 rm 删除文件
rm = Remove,删除文件。这是一个危险的命令,因为 Linux 没有"回收站",删了就是删了!
6.9.1 rm 文件:删除文件
| |
默认不询问是个常见误解:Linux 里
rm默认不问,你说删就删。网上很多"rm 会问你"的说法,其实是因为那些系统的管理员设置了alias rm='rm -i'。
6.9.2 rm -r 目录:递归删除
| |
6.9.3 rm -f:强制删除
| |
6.9.4 rm -rf /:危险命令(不要执行!)
这是一个段子级别的危险命令!rm -rf / 意味着"强制递归删除根目录下的所有文件"——相当于砸掉你的整个 Linux 系统!
| |
为什么
--preserve-root只能救一部分:它保护的是根目录/本身,但rm -rf /*、rm -rf ~、rm -rf /home/xxx它都管不着。所以真正的防线是习惯:删之前先pwd看清自己在哪、把路径写完整、必要时先用ls或echo把通配符展开看一眼要删什么。
🚨 为什么"多打一个空格"很要命:
rm -rf /tmp删的是/tmp;但如果写成rm -rf / tmp,就变成了"删/和删当前目录下名为tmp的东西"(/会被--preserve-root拦住,但tmp会被删掉)。一个空格就把"删一个目录"变成了"删两个目标"。所以敲 rm 之前,先echo展开一遍看看到底要删什么。😱 另一类事故:
rm -rf *删的是当前目录的全部可见文件。如果这时候你人不在你以为的目录里(比如cd失败了、或者脚本里的cd出错),删的就是别的地方。所以习惯上先pwd确认位置,或者先ls看一遍。💡 保命口诀:
- 删文件前,先
ls看看- 用
rm -rf时,手不要抖- 看到
rm -rf /,赶紧 Ctrl+C- 定期备份,以防万一
6.10 危险的 rm -rf /:如何避免致命错误
6.10.1 使用别名保护:alias rm=‘rm -i’
在 .bashrc 里添加别名,让 rm 默认带上 -i(询问确认):
| |
设置别名后,每次删除都会询问确认,多了一道安全锁!
6.10.2 使用 trash 替代 rm
有人开发了 trash-cli 工具,把文件扔进"回收站"而不是直接删除:
| |
如果你是那种经常"误删"的人,这个工具绝对是救星!
6.11 实战练习:组织你的文件结构
6.11.1 创建项目目录
让我们来实操一下,创建一个项目目录结构:
| |
6.11.2 移动和整理文件
| |
graph TD
A["my_project/"] --> B["src/"]
A --> C["docs/"]
A --> D["tests/"]
A --> E["config/"]
B --> F["main.py"]
B --> G["utils.py"]
C --> H["README.md"]
D --> I["test_main.py"]小结:掌握了文件操作命令,你就能像整理房间一样整理你的数字生活!多练习,熟能生巧!
本章小结
本章我们学习了 Linux 文件系统的基础操作!
核心命令回顾:
| 命令 | 作用 | 常用选项 |
|---|---|---|
ls | 列出目录内容 | -l 详细信息, -a 显示隐藏, -h 人性化, -R 递归, -S 按大小, -t 按时间 |
pwd | 显示当前目录 | -P 显示物理路径 |
cd | 切换目录 | ~ 家目录, - 上次目录, .. 上级目录 |
mkdir | 创建目录 | -p 递归创建, -v 显示过程 |
touch | 创建空文件/更新时间 | -d 设置日期 |
cp | 复制文件/目录 | -r 递归, -i 询问, -v 显示, -p 保留属性 |
mv | 移动/重命名 | -i 询问 |
rm | 删除文件/目录 | -r 递归, -f 强制 |
重要安全提示:
rm没有"回收站",删了就是删了!- 默认的
rm不会询问,除非你设置了alias rm='rm -i'或手动加-i - 建议把
alias rm='rm -i'加到~/.bashrc - 或者使用
trash-cli工具替代rm - 备份/迁移目录用
cp -a,普通复制才用cp -r
通配符总结:
*= 匹配任意字符?= 匹配单个字符[]= 匹配范围内字符{}= 生成序列
下一章我们将学习文件查看与编辑器,包括 cat、less、vim 等查看和编辑文件的神器!敬请期待!