前言
刚接触 Linux 的小伙伴,是不是一打开终端就一脸懵?看着满屏的命令和奇怪的目录结构,完全不知道从哪下手?
别慌!今天这篇文章,我会用最通俗的大白话,带大家搞定 Linux 最基础也最重要的文件管理和标准输入输出重定向。这两个知识点是所有 Linux 操作的基石,不管你是做运维、开发还是测试,只要用 Linux 就绕不开它们。
全程没有晦涩的术语,每个命令都配了实际例子,跟着敲一遍就能学会。看完这篇,你再也不会对着/etc、/usr这些目录发呆,也不会因为手滑敲了rm -rf而慌到出汗~
一、先搞懂 Linux 的 “户型图”:文件系统目录结构
Windows 的文件是按 C 盘、D 盘划分的,而 Linux 完全不一样 —— 它所有的文件都放在一棵倒置的大树上,最顶端是根目录/,所有文件和目录都从这里衍生出来。
1.1 什么是 FHS?
为了让不同 Linux 发行版(比如 Ubuntu、CentOS)的目录结构统一,Linux 基金会制定了FHS(文件系统层次化标准)。简单说,FHS 就是 Linux 界的 “统一户型图”,规定了每个目录该放什么东西,这样不管你用哪个发行版,找文件都不会乱。
1.2 核心目录功能速查表
不用死记硬背,先混个脸熟,用多了自然就记住了:
| | |
|---|
/root | | 只有 root 用户能进,相当于 Windows 的 “管理员桌面” |
/home/用户名 | | 比如你的用户叫 alice,家目录就是/home/alice,平时自己的文件都放这 |
/etc | | 所有软件的配置文件基本都在这,比如网络配置、服务配置 |
/bin | | /bin放所有用户都能用的命令(比如ls、cd),/sbin放只有管理员能用的命令(比如reboot) |
/usr | | 相当于 Windows 的Program Files,安装的软件大部分都在这 |
/var | | 放经常变化的文件,比如日志(/var/log)、缓存、进程 pid 文件 |
/tmp | | |
/dev | | Linux 里一切皆文件,你的硬盘、U 盘、键盘都会在这里变成一个文件 |
/boot | | |
1.3 新版本的小变化
现在的 CentOS 8+、Ubuntu 18.04 + 系统里,/bin、/sbin、/lib、/lib64都变成了软链接,实际指向/usr下面的对应目录。你可以敲这个命令验证一下:
ls -l /bin /sbin /lib /lib64
输出结果里会看到类 似lrwxrwxrwx 1 root root 7 May 11 2019 /bin -> usr/bin的内容,这就是软链接,相当于 Windows 的快捷方式。
1.4 一眼识别文件类型:颜色和标识符
Linux 终端里不同颜色的文件代表不同类型,不用敲命令就能快速判断:
二、新手必学的文件操作命令(从入门到熟练)
2.1 我在哪?pwd显示当前目录
刚打开终端,不知道自己在哪个目录?敲pwd就对了:
# 显示当前工作目录的绝对路径pwd# 输出示例:/root
-P:显示真实物理路径(如果当前目录是软链接,会显示它指向的实际目录)-L
2.2 怎么去?cd切换目录
cd是最常用的命令,记住这几个用法就够了:
# 切换到指定目录(绝对路径)cd /etc/apt# 切换到指定目录(相对路径,从当前目录出发)cd apt.conf.d# 回到上一级目录cd ..# 回到上上次所在的目录(超级实用!)cd -# 直接回到当前用户的家目录cd# 或者cd ~# 切换到指定用户的家目录(需要权限)
2.3 有什么?ls列出目录内容
ls用来查看当前目录里有什么文件和目录,常用选项一定要记牢:
# 列出当前目录的文件和目录(只显示名称)ls# 显示详细信息(权限、大小、修改时间等)ls -l# 很多系统里ll是ls -l的别名,直接敲ll更方便ll# 显示所有文件,包括隐藏文件(以.开头的文件)ls -la# 递归显示所有子目录的内容ls -R# 只显示目录本身,不显示里面的内容ls -ld /etc# 按文件大小从大到小排序ls -lhS# 按修改时间从新到旧排序
2.4 文件的 “身份证”:stat查看文件状态
每个文件都有两部分信息:元数据(属性)和内容。stat命令可以查看文件的完整元数据,包括三个非常重要的时间戳:
# 查看文件的详细状态stat /etc/fstab
输出结果里的三个时间:
AccessModifyChange(ctime):最后一次修改文件元数据(权限、属主等)的时间
2.5 这是什么文件?file判断文件类型
Linux 不根据后缀名判断文件类型,所以有时候你拿到一个没有后缀的文件,不知道怎么打开,用file命令就对了:
# 判断文件类型file test.sh# 输出:test.sh: Bourne-Again shell script, ASCII text executable# 只显示结果,不显示文件名file -b test.txt
实用技巧:Windows 和 Linux 的文本文件换行符不一样,Windows 是CRLF,Linux 是LF。用file命令可以看到这个区别,用dos2unix命令可以转换格式:# 安装转换工具apt install dos2unix# 将Windows文本转成Linux格式dos2unix win.txt# 将Linux文本转成Windows格式unix2dos linux.txt
2.6 批量操作神器:文件通配符
想批量操作多个文件?不用一个个写文件名,用通配符就行:
例子:
# 列出所有以.txt结尾的文件ls *.txt# 列出所有以a开头、中间有一个数字、以b结尾的文件ls a?b.txt# 列出所有文件名是3个字符的文件ls ???
2.7 创建空文件:touch
touch主要用来创建空文件,也可以刷新文件的时间戳:
# 创建一个空文件touch test.txt# 同时创建多个文件touch file1.txt file2.txt file3.txt# 创建带时间戳的文件(超级实用!)touch $(date +%F_%T).log# 输出示例:2026-05-15_14:30:00.log
2.8 复制粘贴:cp命令
cp用来复制文件和目录,新手最容易踩的坑是覆盖文件不提示,所以建议养成加-i选项的习惯:
# 复制文件到指定目录cp test.txt /tmp/# 复制文件并重命名cp test.txt /tmp/test_bak.txt# 复制目录(必须加-r选项递归复制)cp -r /etc/sysconfig/ /tmp/# 复制时保留文件的权限、时间等属性cp -p test.txt /tmp/# 复制前先备份原文件(防止覆盖)cp -b test.txt test_bak.txt# 保留多版本备份cp --backup=numbered test.txt test_bak.txt# 会生成test_bak.txt.~1~、test_bak.txt.~2~这样的备份文件
2.9 移动 / 重命名:mv和rename
mv命令既可以移动文件,也可以重命名文件:
# 重命名文件mv old.txt new.txt# 移动文件到指定目录mv test.txt /tmp/# 移动多个文件到目录mv file1.txt file2.txt /tmp/# 移动前先备份mv -b test.txt /tmp/
如果需要批量重命名,用rename命令更方便。注意:CentOS 和 Ubuntu 的rename用法不一样:# CentOS用法:将所有.txt文件改成.logrename txt log *.txt# Ubuntu用法:将所有.txt文件改成.log(用正则表达式)rename 's/\.txt$/\.log/' *.txt
2.10 危险!删除命令rm
rm是 Linux 里最危险的命令,没有之一!因为 Linux 没有回收站,删了就很难恢复了。
新手必记的安全用法:
# 删除文件(会提示确认)rm -i test.txt# 强制删除文件(不提示,慎用!)rm -f test.txt# 删除目录(必须加-r递归删除)rm -rf testdir/
# 删根!会清空整个系统,生产环境执行这个直接跑路吧rm -rf /# 这个也一样危险,删根目录下所有内容rm -rf /*
防误删技巧:给rm定义别名,把删除改成移动到回收站:# 临时生效alias rm='mv -t /tmp'# 永久生效,把上面这句话加到~/.bashrc文件里echo "alias rm='mv -t /tmp'" >> ~/.bashrcsource ~/.bashrc
2.11 目录操作:tree、mkdir、rmdir
# 安装treeapt install tree# 显示当前目录的树形结构tree# 只显示2层目录tree -L 2 /# 只显示目录tree -d
# 创建单个目录mkdir testdir# 递归创建多级目录(最常用)mkdir -p a/b/c/d# 创建目录并指定权限mkdir -m 777 testdir
rmdir:删除空目录 只能删除空目录,如果目录里有文件,用rm -rf:# 删除空目录rmdir testdir# 递归删除多级空目录rmdir -p a/b/c/d
三、搞懂 inode:Linux 文件的底层秘密
很多新手会遇到一个奇怪的问题:磁盘还有很多空间,但创建文件时却提示 “No space left on device”。这时候就要了解 inode 了。
3.1 inode 到底是什么?
你可以把 inode 想象成文件的身份证:
- 每个文件都有一个唯一的 inode 号(身份证号)
- inode 里存储了文件的元数据(权限、属主、大小、时间戳等,也就是身份证上的信息)
- 文件的实际内容存在 **block(数据块)** 里(相当于房子里的东西)
磁盘格式化的时候,会分成两个区域:
- inode 区:存储所有文件的 inode,一般占磁盘空间的 1% 左右
- 数据区
所以,一个磁盘能存多少文件,不仅取决于磁盘大小,还取决于 inode 的数量。如果 inode 用完了,即使磁盘还有空间,也无法创建新文件。
3.2 查看 inode 信息
# 查看磁盘的inode使用情况df -i# 查看文件的inode号ls -i test.txt# 查看文件的详细inode信息stat test.txt
3.3 inode 和文件操作的关系
- 复制文件:分配一个新的 inode,复制数据到新的 block
- 删除文件:只是把 inode 的链接数减 1,数据并没有立刻删除,等有新文件覆盖时才会真正删除
- 移动文件:如果在同一个分区,只是改变文件名和目录映射,inode 和数据都不变,所以速度非常快
3.4 生产踩坑:inode 耗尽怎么办?
inode 耗尽通常是因为产生了大量的小文件(比如日志、缓存)。解决方法:
- 重新格式化磁盘,调整 inode 数量(不推荐,会丢失数据)
四、标准输入输出与重定向:让命令听你指挥
4.1 什么是标准输入输出?
Linux 系统给每个程序都默认打开了三个 “文件”:
- 标准输入(stdin,文件描述符 0)
- 标准输出(stdout,文件描述符 1)
- 标准错误(stderr,文件描述符 2)
你可以敲这个命令验证一下:
4.2 输出重定向:把结果写到文件里
默认情况下,命令的结果会显示在屏幕上。用输出重定向,可以把结果写到文件里:
例子:
# 把ls的结果写到out.txt里(覆盖)ls > out.txt# 把ls的结果追加到out.txt里ls >> out.txt# 把错误信息写到err.txt里,正常结果显示在屏幕ls fstab null 2> err.txt# 把正常结果和错误信息都写到all.log里ls fstab null &> all.log# 等价于ls fstab null > all.log 2>&1
# 最安全的清空大文件方法cat /dev/null > huge.log
4.3 输入重定向:从文件读数据
默认情况下,程序从键盘读取数据。用输入重定向,可以让程序从文件里读取数据:
# 从a.txt里读取数据,交给bc命令计算echo "1+2+3+4+5" > a.txtbc < a.txt# 输出:15
五、新手避坑总结
- 绝对不要在生产环境执行
rm -rf /* - 复制、移动、删除文件前,先用
ls确认一下文件名和路径 - 遇到 “磁盘满” 的提示,先看
df -h(数据空间)和df -i(inode 空间) - Windows 和 Linux 的文本文件换行符不一样,跨系统传输后记得用
dos2unix转换
写在最后
Linux 的文件管理和 IO 重定向看起来知识点多,但其实都是非常实用的基础操作。不用死记硬背,多敲几遍命令,遇到问题多查资料,慢慢就熟练了。
版权声明:本文内容转载自自CSDN博客:Youyan52O,遵循CC 4.0 BY-SA版权协议上原文接及本声明。本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行可。原文链接:https://blog.csdn.net/Youyan52O/article/details/161120753?spm=1001.2660.3001.10198&utm_medium=distribute.pc_feed_vip_blog_category.none-task-blog-classify_tag-17-161120753-null-null.nonecase&depth_1-utm_source=distribute.pc_feed_vip_blog_category.none-task-blog-classify_tag-17-161120753-null-null.nonecase如有涉及到侵权,请联系,将立即予以删除处理。在此特别鸣谢原作者的创作。此篇文章的所有版权归原作者所有,与本公众号无关,商业转载建议请联系原作者,非商业转载请注明出处。