Linux 文件与目录管理详解(新手详细版)
本文档面向零基础新手,从“怎么在 Linux 里找文件、建目录、复制移动删除”讲起,系统介绍查看、创建、复制、移动、删除、查看内容、查找、链接等操作,并配有大量示例。
一、先弄清几个概念
1.1 当前目录(工作目录)
你打开终端后,始终处于某个目录里,这个目录叫当前工作目录。
命令若使用“相对路径”,都是相对于这个目录。
- 查看当前目录:
pwd(print working directory) - 切换当前目录:
cd 路径
pwd
# 输出例如:/home/zhangsan
cd /tmp
pwd
# 输出:/tmp
1.2 主目录(家目录)
每个用户有一个“自己的文件夹”,叫主目录,一般路径是 /home/用户名。
root 用户的主目录是 /root。
- 快速回到主目录:
cd或cd ~ - 在任意位置表示主目录:用
~
cd ~
pwd
# 输出:/home/zhangsan
# 进入主目录下的 Documents
cd ~/Documents
# 表示“主目录下的 file.txt”
cat ~/file.txt
1.3 路径:绝对路径 与 相对路径
- 绝对路径:从根
/写起,例如/home/zhangsan/Documents。
无论当前在哪,都能唯一确定位置。 - 相对路径:相对于当前目录。
file.txt:当前目录下的 file.txtDocuments:当前目录下的 Documents..:上一级目录.:当前目录本身
# 假设当前在 /home/zhangsan
cd Documents # 进入 /home/zhangsan/Documents
cd .. # 回到 /home/zhangsan
cd ../lisi/Desktop # 进入 /home/lisi/Desktop
cd . # 仍在当前目录(一般不用)
二、查看目录里有什么:ls
2.1 基本用法
ls # 列出当前目录下的文件和目录名(不包含以 . 开头的隐藏项)
ls /tmp # 列出 /tmp 下的内容
ls ~/Documents # 列出主目录下 Documents 里的内容
2.2 常用选项
| 选项 | 含义 | 示例 |
|---|---|---|
-l |
长格式:权限、属主、大小、时间等 | ls -l |
-a 或 -A |
显示隐藏文件(以 . 开头的) |
ls -a |
-h |
人类可读的大小(K、M、G) | ls -lh |
-t |
按修改时间排序,新的在前 | ls -lt |
-r |
反向排序 | ls -ltr(旧的在前面) |
-R |
递归列出子目录内容 | ls -R |
-d |
只显示目录本身,不展开内容 | ls -ld /tmp |
-1 |
每行一个名字 | ls -1 |
2.3 示例
# 最常用:长格式 + 人类可读大小
ls -lh
# 看当前目录下所有文件(含隐藏)
ls -la
# 看 /etc 这个目录本身的信息(权限、属主等),而不是 /etc 里的文件
ls -ld /etc
# 按时间排,最新的在前
ls -lt
# 递归列出当前目录及所有子目录
ls -R
三、切换目录:cd
3.1 用法
cd 路径 # 进入指定路径
cd # 或 cd ~ :回到主目录
cd - # 回到“上一次”所在的目录
cd .. # 进入上一级目录
3.2 示例
cd /home/zhangsan/Documents
pwd
# /home/zhangsan/Documents
cd ..
pwd
# /home/zhangsan
cd /
pwd
# /
cd -
pwd
# 又回到 /home/zhangsan(刚才的“上一级”的上一级)
cd ~/Downloads
# 等价于 cd /home/zhangsan/Downloads
四、创建:文件用 touch,目录用 mkdir
4.1 创建空文件:touch
touch 文件名
若文件已存在,touch 会更新其“最后修改时间”,不会清空内容。
touch newfile.txt
ls -l newfile.txt
# 大小为 0
touch newfile.txt
# 再执行一次,只更新修改时间,仍为空
一次创建多个:
touch a.txt b.txt c.txt
touch file{1,2,3}.txt # 创建 file1.txt、file2.txt、file3.txt
4.2 创建目录:mkdir
mkdir 目录名
若父目录不存在,加 -p 可一次性创建多级目录(不会报错):
mkdir mydir
mkdir -p project/src/main/java
# 会创建 project,再 project/src,再 project/src/main,再 project/src/main/java
4.3 示例
mkdir test
cd test
touch readme.txt
mkdir docs
touch docs/note.txt
ls -lR
# 当前目录:readme.txt、docs/
# docs/:note.txt
五、复制:cp
5.1 基本语法
cp 源 目标
- 目标为文件名:复制为“另一个文件”。
- 目标为已存在的目录:复制到该目录下,保持原文件名(可多个源)。
5.2 常用选项
| 选项 | 含义 |
|---|---|
-r 或 -R |
递归复制目录(必须加,否则目录不会复制) |
-i |
覆盖前询问(推荐新手用) |
-p |
保留权限、时间等属性 |
-v |
显示复制了哪些文件 |
-f |
强制覆盖(慎用) |
5.3 示例
# 复制文件
cp file.txt file_backup.txt
cp file.txt ~/Documents/
# 复制多个文件到同一目录
cp a.txt b.txt /tmp/
# 复制目录(必须 -r)
cp -r mydir mydir_backup
cp -r mydir /tmp/
# 复制时保留属性
cp -p important.cfg important.cfg.bak
# 覆盖前询问(避免误删)
cp -i new.txt old.txt
# 若 old.txt 存在,会问:overwrite old.txt? (y/n)
六、移动与重命名:mv
在 Linux 里,“移动”和“重命名”是同一命令:mv。
区别只在于目标是“目录”还是“新名字”。
6.1 语法
mv 源 目标
- 目标为目录:把源移进该目录(可多个源)。
- 目标为不存在的名字:相当于重命名。
6.2 常用选项
| 选项 | 含义 |
|---|---|
-i |
覆盖前询问 |
-v |
显示移动了哪些 |
-f |
强制覆盖(慎用) |
6.3 示例
# 重命名
mv oldname.txt newname.txt
# 移动到目录
mv file.txt ~/Documents/
mv a.txt b.txt /tmp/
# 移动目录(不需要 -r)
mv mydir ~/projects/
# 覆盖前询问
mv -i new.txt old.txt
七、删除:rm 与 rmdir
7.1 删除文件:rm
rm 文件
注意:Linux 下删除后一般无法恢复,务必谨慎。
| 选项 | 含义 |
|---|---|
-r 或 -R |
递归删除目录及其内容 |
-f |
不提示、强制删(非常危险,慎用) |
-i |
每个文件都询问(推荐新手用) |
7.2 示例
# 删一个文件
rm junk.txt
# 删多个文件
rm a.txt b.txt c.txt
# 删目录及其内部所有内容(危险!)
rm -r old_project
# 推荐:删目录前逐个确认
rm -ri old_project
# 千万避免(会删掉整个系统!):
# rm -rf /
# rm -rf /*
7.3 只删空目录:rmdir
rmdir 空目录名
若目录里有文件或子目录,rmdir 会报错,不会删。
适合“确定目录是空的,只想删目录本身”时用。
mkdir empty_dir
rmdir empty_dir
# 成功
mkdir not_empty
touch not_empty/f.txt
rmdir not_empty
# rmdir: failed to remove 'not_empty': Directory not empty
八、查看文件内容(不修改文件)
8.1 cat:整篇输出
把文件内容全部打到屏幕上,适合小文件。
cat readme.txt
cat /etc/hostname
一次看多个文件(按顺序拼接输出):
cat a.txt b.txt
8.2 less:分页查看(推荐大文件)
可上下翻页、搜索,不把整个文件读进内存,适合大文件。
- 空格:下一页
- b:上一页
- /关键词:向下搜索
- n:下一个匹配
- q:退出
less /var/log/syslog
8.3 more:简单分页
类似 less,但功能少一些,一般用 less 即可。
more longfile.txt
8.4 head:只看前面几行
head readme.txt # 默认前 10 行
head -n 5 readme.txt # 前 5 行
head -5 readme.txt # 同上
8.5 tail:只看后面几行
tail readme.txt # 默认后 10 行
tail -n 20 readme.txt # 后 20 行
tail -20 readme.txt # 同上
实时跟踪(日志常用):文件有新内容就继续显示。
tail -f /var/log/syslog
# 按 Ctrl+C 退出
8.6 示例汇总
# 小文件:直接看
cat ~/.bashrc | head -20
# 大文件:用 less
less /var/log/syslog
# 只看前 5 行、后 5 行
head -5 config.ini
tail -5 config.ini
# 看日志最后 50 行并持续跟踪
tail -n 50 -f /var/log/nginx/access.log
九、查找文件:find 与 locate
9.1 find:按条件在目录树里找
基本形式:
find 从哪里找 条件 [条件...] [对结果执行的动作]
按名字找(最常用):
# 当前目录及子目录下,名字为 readme.txt 的文件
find . -name "readme.txt"
# 名字以 .txt 结尾(注意引号,避免 shell 先展开 *)
find . -name "*.txt"
# 不区分大小写:-iname
find . -iname "README*"
按类型找:
find . -type f # 只找普通文件
find . -type d # 只找目录
find . -type l # 只找符号链接
按时间找:
# 7 天内修改过的文件
find . -mtime -7
# 超过 30 天未修改的
find . -mtime +30
按大小找:
# 大于 10MB 的文件
find . -size +10M
# 空文件
find . -empty
组合条件:
# 当前目录下,名字以 .log 结尾的普通文件
find . -type f -name "*.log"
# 主目录下 7 天内修改过的 .txt 文件
find ~ -type f -name "*.txt" -mtime -7
9.2 locate:按名字快速查(需先建库)
locate 查的是“文件名数据库”,速度快,但可能不是实时的(依赖定期更新数据库)。
# 若系统有安装 locate
locate passwd
# 会列出路径里包含 passwd 的文件
# 更新数据库(通常需 root)
sudo updatedb
十、在文件内容里搜索:grep
10.1 基本用法
在文件内容里找包含某字符串的行,并打印出来。
grep "要搜的字符串" 文件
10.2 常用选项
| 选项 | 含义 |
|---|---|
-i |
忽略大小写 |
-n |
显示行号 |
-v |
反向:只显示“不包含”的行 |
-r 或 -R |
递归在目录下所有文件中搜 |
-l |
只显示“包含匹配”的文件名,不显示具体行 |
-c |
只显示每个文件匹配的行数 |
10.3 示例
# 在单个文件里搜
grep "error" /var/log/syslog
grep -n "error" app.log # 带行号
grep -i "ERROR" app.log # 忽略大小写
# 在多个文件里搜
grep "TODO" *.java
# 在当前目录及子目录所有文件里搜
grep -r "function_name" .
grep -rn "function_name" . # 带行号
# 只列出“哪个文件包含”
grep -rl "config" .
# 反向:不含 "debug" 的行
grep -v "debug" app.log
十一、通配符(模糊匹配文件名)
在命令行里,通配符由 Shell 先展开成一批文件名,再交给命令。
常用在 ls、cp、rm、mv 等命令里。
11.1 常用通配符
| 符号 | 含义 | 示例 |
|---|---|---|
* |
任意多个任意字符(含 0 个) | *.txt 表示所有 .txt 文件 |
? |
任意一个字符 | file?.txt 可匹配 file1.txt、filea.txt |
[ ] |
括号内任选一个字符 | file[123].txt 匹配 file1.txt、file2.txt、file3.txt |
[! ] 或 [^ ] |
不在括号内的一个字符 | file[!0].txt 匹配 file1.txt 等,不匹配 file0.txt |
{ } |
展开成多个(逗号分隔) | file{1,2,3}.txt 即 file1.txt file2.txt file3.txt |
11.2 示例
# 列出所有 .txt 文件
ls *.txt
# 列出所有以 report 开头的
ls report*
# 删除所有 .tmp 文件(先 ls 确认再删)
ls *.tmp
rm -i *.tmp
# 复制所有 .log 到 backup/
cp *.log backup/
# 只匹配一个字符
ls file?.txt
# 匹配 file1.txt、file2.txt、file3.txt
ls file[123].txt
# 生成 file1.txt、file2.txt、file3.txt
touch file{1,2,3}.txt
十二、链接:硬链接与符号链接
12.1 硬链接:ln(不加 -s)
多个“文件名”指向同一份数据(同一 inode)。
不能对目录做硬链接,一般不能跨分区。
ln 已有文件 新名字
echo "hello" > orig.txt
ln orig.txt hardlink.txt
ls -li orig.txt hardlink.txt
# 两个 inode 相同,链接数为 2
cat hardlink.txt
# 输出:hello
12.2 符号链接(软链接):ln -s
一个“快捷方式”文件,内容是目标路径。
可指向目录,可跨分区;删目标后链接会“断”。
ln -s 目标路径 链接名
ln -s /home/zhangsan/docs mydocs
ls -l mydocs
# lrwxrwxrwx ... mydocs -> /home/zhangsan/docs
cd mydocs
# 实际进入 /home/zhangsan/docs
十三、重定向与管道(配合文件管理)
13.1 输出重定向
>:把命令的标准输出写到文件,覆盖原文件。>>:追加到文件末尾。
echo "第一行" > out.txt
echo "第二行" >> out.txt
cat out.txt
# 第一行
# 第二行
ls -l > listing.txt
# ls 的结果写入 listing.txt,不在屏幕显示
13.2 输入重定向
<:从文件读入,作为命令的标准输入。
sort < unsorted.txt > sorted.txt
13.3 管道 |
前一个命令的标准输出,作为后一个命令的标准输入。
# 列出 .txt 文件并统计个数
ls *.txt | wc -l
# 在长列表中只显示包含 "config" 的行
ls -l | grep config
# 查看文件行数
cat readme.txt | wc -l
# 或直接:wc -l readme.txt
十四、其他实用命令(与文件管理相关)
14.1 比较两个文件:diff
diff file1.txt file2.txt
# 无输出表示两文件相同;有输出会标出差异
14.2 统计行数、字数、字节:wc
wc readme.txt
# 输出:行数 词数 字节数 文件名
wc -l readme.txt # 只统计行数
wc -w readme.txt # 只统计词数
wc -c readme.txt # 只统计字节数
14.3 排序:sort
# 按行排序(默认按字符)
sort names.txt
# 输出到新文件
sort names.txt -o sorted_names.txt
14.4 去重相邻行:uniq
常与 sort 配合:先 sort 再 uniq,才能去掉所有重复行。
sort list.txt | uniq
14.5 打包与压缩(简要)
# 仅打包(不压缩)
tar -cvf archive.tar mydir/
# 打包并用 gzip 压缩(常见 .tar.gz)
tar -czvf archive.tar.gz mydir/
# 解压 .tar.gz
tar -xzvf archive.tar.gz
# 仅压缩单个文件
gzip file.txt # 生成 file.txt.gz,原文件会消失
gunzip file.txt.gz
十五、一条龙示例:从创建到查找
下面用一串操作把前面多数命令串起来(可在自己的目录里照着做):
# 1. 建目录和文件
mkdir -p ~/practice/files
cd ~/practice
touch files/{a,b,c}.txt
echo "hello" > files/a.txt
echo "world" > files/b.txt
# 2. 查看
ls -l files/
cat files/a.txt
# 3. 复制、移动
cp files/a.txt files/a_backup.txt
mv files/c.txt files/old_c.txt
# 4. 在内容里搜索
grep "hello" files/*.txt
# 5. 按名字查找
find . -name "*.txt"
# 6. 看行数
wc -l files/*.txt
# 7. 建链接
ln -s files link_to_files
ls -l link_to_files
# 8. 清理(先确认再删)
ls files/
rm -i files/old_c.txt
十六、安全与习惯建议(新手必读)
- 删前先看:用
ls或find确认要删的是不是这一批,再用rm -i或rm -ri。 - 绝对不要执行
rm -rf /或rm -rf /*,会毁掉整个系统。 - 重要文件先备份:
cp -p或先复制到备份目录再改。 - 用 tab 补全:输入路径或文件名时多按 Tab,减少输错。
- 用通配符前先 ls:例如先
ls *.txt再rm *.txt,避免误删。 - 区分“删文件”和“删目录”:删目录用
rm -r,确认再用rm -ri。
十七、命令速查表
| 需求 | 命令示例 |
|---|---|
| 当前目录 | pwd |
| 列出内容 | ls、ls -l、ls -la、ls -lh |
| 切换目录 | cd 路径、cd ~、cd ..、cd - |
| 建空文件 | touch 文件名 |
| 建目录 | mkdir 目录、mkdir -p 多级路径 |
| 复制 | cp 源 目标、cp -r 目录 目标、cp -i |
| 移动/重命名 | mv 源 目标、mv -i |
| 删文件 | rm 文件、rm -i |
| 删目录 | rm -r 目录、rm -ri 目录、rmdir 空目录 |
| 看内容 | cat、less、head、tail、tail -f |
| 按名找文件 | find . -name "*.txt"、locate 关键词 |
| 在内容里搜 | grep "串" 文件、grep -rn "串" . |
| 硬链接 | ln 源 新名 |
| 符号链接 | ln -s 目标 链接名 |
| 重定向 | > 覆盖、>> 追加、< 输入 |
| 管道 | 命令1 | 命令2 |
| 行数/词数 | wc -l、wc -w |
| 比较文件 | diff 文件1 文件2 |
| 打包压缩 | tar -czvf xxx.tar.gz 目录、tar -xzvf xxx.tar.gz |
十八、小结
文件与目录管理主要围绕:在哪里(pwd、cd)、有什么(ls)、建什么(touch、mkdir)、复制移动删(cp、mv、rm)、看内容(cat、less、head、tail)、找文件(find、grep)、链接(ln、ln -s)。
配合路径、通配符、重定向和管道,就能完成绝大部分日常操作。
建议在 ~/practice 下按本文示例逐条练习,再结合 Linux简介.md、Linux系统目录结构.md、Linux文件基本属性.md 一起看,会对“文件在哪、怎么管、属性是什么”有完整认识。
文档以常见 Linux 发行版与 Bash 为准;不同 Shell 下通配符或部分行为可能略有差异。