Linux文件与目录管理

Linux 文件与目录管理详解(新手详细版)

本文档面向零基础新手,从“怎么在 Linux 里找文件、建目录、复制移动删除”讲起,系统介绍查看、创建、复制、移动、删除、查看内容、查找、链接等操作,并配有大量示例。


一、先弄清几个概念

1.1 当前目录(工作目录)

你打开终端后,始终处于某个目录里,这个目录叫当前工作目录
命令若使用“相对路径”,都是相对于这个目录。

  • 查看当前目录pwd(print working directory)
  • 切换当前目录cd 路径
pwd
# 输出例如:/home/zhangsan

cd /tmp
pwd
# 输出:/tmp

1.2 主目录(家目录)

每个用户有一个“自己的文件夹”,叫主目录,一般路径是 /home/用户名
root 用户的主目录是 /root

  • 快速回到主目录cdcd ~
  • 在任意位置表示主目录:用 ~
cd ~
pwd
# 输出:/home/zhangsan

# 进入主目录下的 Documents
cd ~/Documents

# 表示“主目录下的 file.txt”
cat ~/file.txt

1.3 路径:绝对路径 与 相对路径

  • 绝对路径:从根 / 写起,例如 /home/zhangsan/Documents
    无论当前在哪,都能唯一确定位置。
  • 相对路径:相对于当前目录。
    • file.txt:当前目录下的 file.txt
    • Documents:当前目录下的 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 先展开成一批文件名,再交给命令。
常用在 lscprmmv 等命令里。

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

十六、安全与习惯建议(新手必读)

  1. 删前先看:用 lsfind 确认要删的是不是这一批,再用 rm -irm -ri
  2. 绝对不要执行 rm -rf /rm -rf /*,会毁掉整个系统。
  3. 重要文件先备份cp -p 或先复制到备份目录再改。
  4. 用 tab 补全:输入路径或文件名时多按 Tab,减少输错。
  5. 用通配符前先 ls:例如先 ls *.txtrm *.txt,避免误删。
  6. 区分“删文件”和“删目录”:删目录用 rm -r,确认再用 rm -ri

十七、命令速查表

需求 命令示例
当前目录 pwd
列出内容 lsls -lls -lals -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 空目录
看内容 catlessheadtailtail -f
按名找文件 find . -name "*.txt"locate 关键词
在内容里搜 grep "串" 文件grep -rn "串" .
硬链接 ln 源 新名
符号链接 ln -s 目标 链接名
重定向 > 覆盖>> 追加< 输入
管道 命令1 | 命令2
行数/词数 wc -lwc -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简介.mdLinux系统目录结构.mdLinux文件基本属性.md 一起看,会对“文件在哪、怎么管、属性是什么”有完整认识。


文档以常见 Linux 发行版与 Bash 为准;不同 Shell 下通配符或部分行为可能略有差异。

发表评论