系统地学习linux命令 —— 这是我从接触linux以来就一直想要做的一件事,可是始终没有找到时间
现在终于得闲了,嘻嘻
我个人认为,与其单独地学习linux的知识点,不如从常见的命令开始,跟着命令一起学习
而且依照知识点和命令循序渐进,对于初学者应该也比较容易接受
于是就有了这篇文章
pwd —— 显示当前工作目录的完整路径
pwd全称是 print working directory,用于显示当前终端所在的工作目录的完整路径
语法格式
pwd [参数]
pwd命令通常不与路径参数一起使用,因为它总是显示当前所在的位置
Linux工作目录
- 在Linux中,每个进程(包括正在使用的shell终端)都有一个当前工作目录,我们执行的所有相对路径命令都是基于这个目录的
- 路径分为物理路径和逻辑路径,物理路径是文件系统上不包含任何符 号链接的真实路径,逻辑路径则可能包含符号链接,
pwd命令可以在这两种路径之间进行切换
常用参数
pwd的参数非常少,主要就是以下两个,用于处理符号链接的情况:
| 参数 | 功能说明 |
|---|---|
| -L | 逻辑路径 显示包含符号链接的路径,这是大多数shell中的默认行为。 |
| -P | 物理路径 显示解析所有符号链接后的真实物理路径,不包含 .或.. |
使用示例
没有示例,这个很简单,自己用去吧
cd —— 切换当前工作目录
cd全名change directory(改变目录),其功能是切换用户当前所在工作目录
语法格式
cd [参数] <目标路径>
Linux路径与特殊目录
- 绝对路径:从根目录
/开始的完整路径,例如/home/user/documents - 相对路径:从当前工作目录开始的路径,不以
/开头,例如../pictures - 特殊目录快捷方式:
~:当前用户的主目录-:上一次所在的目录.:当前目录..:上一级目录
常用参数
| 参数 | 功能说明 |
|---|---|
| -L | 遵循逻辑路径 如果要切换到的目录是一个符号链接,则进入该符号链接本身。这是默认行为 |
| -P | 遵循物理路径 在切换目录前,解析所有的符号链接,直接进入其指向的真实物理目录 |
使用示例
-
使用绝对路径切换到系统日志目录
cd /var/log -
使用相对路径进入当前目录下的子目录
cd dir -
返回主目录,有两种方式
不带任何参数:
cd或者使用
~快捷方式:cd ~ -
切换到上一级目录 —— 这是日常操作中使用频率非常高的命令
cd .. -
在当前目录和上一个目录之间切换
cd - -
切换到包含特殊字符的目录
cd "My Documents"如果目录名包含空格或其它特殊字符,需要用引号将其包裹起来
ls —— 显示目录中的文件及其属性信息
语法格式
ls [参数] <文件目录名>
Linux的目录特点
-
linux文件或者目录名称最长可达256个字符
-
以
.开头的文件是隐藏文件,需要用-a参数才能显示 -
.代表当前目录 -
..代表上一级目录
Linux匹配技法
使用命令对文件进行操作的时候,如果有很多文件需要处理,我们一个个去寻找、执行,那就太过耗时
为了减少时间,我们可以使用正则,也能使用shell自带的匹配方式,下面就来介绍两种
通配符与PATTERN
Linux通配符是shell提供的一种字符模式匹配机制(PATTERN),常用于文件名匹配与路径匹配
它属于通配符扩展机制,不是正则表达式,但语法上有些相似
星号:*
*可以匹配任意数量的任意字符(包括 0 个字符)
匹配所有以 .txt 结尾的文件:
ls *.txt
匹配所有以 file 开头的文件:
ls file*
问号:?
?可以匹配任意一个字符
匹配file1.txt、fileA.txt,但不匹配file10.txt:
ls file?.txt
中括号:[]
匹配[]内的任意一个字符或字符范围
匹配 file1.txt、file2.txt、file3.txt:
ls file[123].txt
在[]中使用连字符-表示字符范围
匹配 filea.txt 到 filez.txt 的所有单个字母文件:
ls file[a-z].txt
可加 ^ 或 ! 表示取反(排除匹配)
匹配不包含小写字母的文件名:
ls file[!a-z].txt
大括号扩展
大括号扩展用于生成字符串序列,执行前由shell展开,并不会匹配文件名
简单列举
格式:
<前缀>{值1,值2,...}<后缀>
eg:
echo file{A,B,C}.txt
展开为fileA.txt fileB.txt fileC.txt
数字序列
格式:
{起始..结束}
eg:
echo file{1..5}.txt
展开为file1.txt file2.txt file3.txt file4.txt file5.txt
字符序列
格式:
{a..z}
eg:
echo {a..d}
展开为a b c d
带步进的序列
格式:
{起始..结束..步长}
eg:
echo {1..10..2}
展开为1 3 5 7 9
嵌套大括号
多个括号组合使用,会展开所有组合方式
eg:
echo {A,B}{1,2}
展开为 A1 A2 B1 B2
常用参数
内容显示
| 参数 | 功能说明 |
|---|---|
| -a | 显示所有文件及目录,包括.开头的隐藏目录 |
| -A | 不显示当前目录(.)和父目录(..) |
| -R | 递归显示所有子文件 |
| -d | 只显示目录本身,不列出目录内容 |
| -i | 显示文件的 inode 号码 |
| -l | 显示文件的详细信息,包含权限、所有者、大小、修改时间等 |
| -h | 与-l一起使用,以更易读的单位(如K, M, G)来显示文件大小 |
| -s | 显示文件占用的磁盘块数 |
| -L | 显示符号链接指向文件的详细信息 |
| –full-time | 显示完整时间戳(精确到秒) |
格式控制
| 参数 | 功能说明 |
|---|---|
| -m | 水平显示文件信息 间隔符是逗号 |
| -F | 在文件名后附加一个字符以表示文件类型:/代表目录,*代表可执行文件,@代表符号链接 |
| -p | 在目录名的末尾加上一个斜杠/与 -F类似但更简洁 |
| -1 | 强制每行只显示一个文件 没有-2,-3.. |
| –color=never/auto/always | 为输出内容添加颜色以区分不同文件类型never不显示,auto自动显示(默认),always强制使用 |
| -C | 按列显示 默认行为,当输出不是终端时生效 |
| -x | 横向显示文件名 按行排列 |
| -N | 显示文件名时不对特殊字符转义(显示原始文件名) |
| –group-directories-first | 让目录显示在前,文件显示在后 |
| –time=WORD | 指定使用哪种时间mtime/modification修改时间(默认)atime/access/use访问时间ctime/change状态改变时间birth创建时间 |
排序方式
| 参数 | 功能说明 |
|---|---|
| -t | 按修改时间排序,最新的文件排在最前面 |
| -S | 按文件大小排序,最大的文件排在最前面 |
| -r | 将当前的排序结果反向排列 |
| -X | 按文件扩展名的字母顺序排序 |
| -c | 按文件状态改变时间排序(如权限变更时间) |
排序方式 —— sort
--sort=WORD可以指定排序方式
| WORD | 排序方式说明 |
|---|---|
| none | 不排序,按目录项原始顺序显示(通常是创建顺序) |
| name | 按名称(文件名)排序(默认行为) |
| extension 或 version | 按文件扩展名排序 |
| size | 按文件大小排序(大文件在前) |
| time | 按默认时间(即--time=modification)排序 |
| atime 或 access 或 use | 按访问时间排序 |
| ctime 或 status | 按状态更改时间排序(如权限改变) |
| birth | 按创建时间排序(如果系统支持) |
使用示例
-
显示
/dev目录下所有以sd开头的文件列表(结合通配符)ls /dev/sd* -
依据文件内容大小进行排序,显示指定目录里的文件名以及详细信息(组合使用参数)
ls -Sl /etc从这里也能看出,linux命令参数是不需要使用多个
-的(-S-l),写在一起即可(-Sl)
tree —— 以树状图格式显示目录内容
tree会以图形化的树状结构来显示文件和目录,比ls命令更直观、更清晰地展示目录的层次关系
并非所有Linux发行版的最小化安装都自带此命令
语法格式
tree [参数] [目录路径]
常用参数
核心功能
| 参数 | 功能说明 |
|---|---|
| -d | 只显示目录,不显示文件 |
| -L <层级> | 指定要显示的目录层级深度 例如, -L 2表示最多显示到第二层目录 |
| -f | 显示每个文件或目录的完整路径前缀 |
| -a | 显示所有文件,包括以.开头的隐藏文件 |
格式控制
| 参数 | 功能说明 |
|---|---|
| -h | 以人类可读的格式(如 K, M, G)显示文件大小 |
| -p | 显示文件和目录的权限 |
| -u | 显示文件或目录的所有者 |
| -g | 显示文件或目录的所属组 |
| –du | 显示每个目录包含内容的总大小 |
内容筛选
| 参数 | 功能说明 |
|---|---|
| -P PATTERN | 只显示匹配PATTERN通配符模式的文件和目录 |
| -I PATTERN | 不显示匹配PATTERN通-符模式的文件和目录 |
使用示例
-
展示/etc目录下两层内的目录结构
tree -d -L 2 /etc -
只显示当前目录结构中所有以.c或.h结尾的文件
tree -P "*.c|*.h"目录本身还是会显示出来,只是不再显示具体的文件,以便维持树状结构
-
显示当前目录的结构,但排除bak和none这两个目录
tree -I "bak|none"
chmod —— 更改文件或目录的访问权限
chmod全称是change mode(改变模式),其功能是更改文件或目录的访问权限,决定了哪些用户可以对它们进行读、写、执行等操作
语法格式
数字模式
chmod [参数] <八进制权限码> <文件名>/<目录名>
符号模式
chmod [参数] [who][operator][permission] <文件名>/<目录名>
Linux文件权限模型
Linux中的文件和目录权限使用三种基本权限 (Permission):
r: read (读权限)w: write (写权限)x: execute (执行权限)- 对文件而言: 是否能运行这个文件
- 对目录而言:是否可以进入该目录(cd)或使用该路径(ln)
而这三个权限分别对应着八进制数值:
- 读(r) = 4
- 写(w) = 2
- 执行(x) = 1
通过将这些权限数值相加,可以组合出不同的权限(-表示没有对应权限),比如:
| 数字 | 权限组合 | 含义 |
|---|---|---|
| 7 | 4+2+1 = rwx | 可读、可写、可执行 |
| 6 | 4+2 = rw- | 可读、可写 |
| 5 | 4+1 = r-x | 可读、可执行 |
| 4 | 4 = r– | 只读 |
| 0 | 0 = — | 没有权限 |
Linux中权限分配给三类用户 (Who):
u: user (文件所有者)g: group (文件所属组)o: others (其他人)
除此之外还有一个表示三类用户集合的标志:
a: all (所有人,u,g,o的合集)
u、g、o分别对应三个八进制权限码数值,利用三位数字组合我们就能表示出三类用户的权限,例如权限值 755 就表示:
- 用户权限:7(rwx)
- 组权限:5(r-x)
- 其他权限:5(r-x)
常见权限对应关系如下:
| 权限值 | 符号形式 | 含义 |
|---|---|---|
| 777 | rwxrwxrwx | 所有人可读写执行(不安全) |
| 755 | rwxr-xr-x | 用户有全部权限,其他用户只能读执行 |
| 700 | rwx—— | 仅用户本人拥有权限 |
| 644 | rw-r–r– | 用户可读写,其他用户只读 |
| 600 | rw——- | 仅用户本人可读写(常用于私密文件) |
可以使用之前学过的ls -l命令查看权限,例如:
drwxr-xr-x 2 user group 4096 Jul 29 10:00 mydir
其中的rwxr-xr-x就是755
符号模式
这是chmod最直观易读的用法,它通过明确的符号来增、删或设定权限
符号模式的命令由三部分构成(各部分之间没有空格,下面加空格是为了方便观看):
[who] [operator] [permission]
who(作用对象):指定要为哪类用户更改权限u: user/所有者g: group/所属组o: others/其他人a: all/所有人(如果省略who,则默认为a)
operator(操作符):指定要执行的操作+: 添加指定的权限-: 移除指定的权限=: 覆盖原有的权限,只给予指定的权限
permission(权限):指定r,w,x中的一种或多种
将这三部分组合起来,就可以精确地调整权限
可以同时进行多个组合,用逗号,隔开
常用参数
命令行选项
| 参数 | 功能说明 |
|---|---|
| -R | 递归地更改目录及其下所有文件和子目录的权限 |
| -v | 显示详细过程,显示每个文件权限的更改情况 |
| -c | 只在权限确实发生更改时才显示报告 |
| –reference=<参考文件> | 将权限设置成参考文件的权限 |
使用示例
数字模式
这是最常用的设置权限的方法,但是需要一些记忆
-
为脚本添加执行权限
chmod 755 my_script.sh这是常见用法之一,
755权限(rwxr-xr-x)意味着:所有者可以读、写、执行;所属组和其他人可以读和执行,这使得脚本可以被所有者修改,被所有人执行 -
设置一个私密文件
chmod 600 private_key.pem600权限(rw-------)意味着只有文件所有者可以读写该文件,其他人没有任何权限 -
将/var/www/html目录以及其下所有文件和子目录的权限都设置为755(目录)或644(文件)
chmod -R 755 /var/www/html
符号模式
这种模式在不希望重新计算整个三位数字,只想微调某个权限时非常有用,很方便
-
为所有用户添加执行权限
chmod a+x file与
chmod 755一样,常见于设置脚本权限 -
为所属组和其他人移除写权限
chmod go-w file -
为文件所有者设置固定的读写权限
chmod u=rw file
其他
-
把new.txt文件权限修改成和old.txt一样
chmod --reference=old.txt new.txt
chgrp & chown —— 更改文件或目录的所有者和所属组
chgrp名称来源于 “change group”,专门用于更改文件或目录的所属组
chown名称来源于 “change owner”,它更加强大,也更加常用,因为它既可以更改文件或目录的所有者,也可以同时更改所属组
语法格式
chown
chown [参数] <新所有者>[:<新所属组>] <文件>/<目录>
chgrp
chgrp [参数] <新所属组> <文件>/<目录>
Linux所有者与所属组
-
在Linux中,每个文件和目录都有一个所有者(Owner)和一个所属组(Group),所有者通常是创建该文件的用户,而所属组允许多个用户共享对文件的访问权限,一个用户可以属于多个组
-
更改所有权通常需要管理员权限(
sudo) -
用户名称和组名称在系统里是分开的:
-
用户名存储在
/etc/passwd文件 -
组名存储在
/etc/group文件
因此,我们可以创建一个用户名叫
alice,也可以有一个组名叫alice,它们是不同的实体,不冲突 -
常用参数
这两个命令的大部分核心参数是通用的,只有--from例外,是chown独有
| 参数 | 功能说明 |
|---|---|
| -R | 递归地更改目录及其子目录下所有文件和目录的所有权 |
| -v | 显示详细过程,为每个被处理的文件打印一条所有权变更的消息 |
| -c | 只在所有权确实发生改变时才显示详细过程 |
| –from=<当前归属> | ———————-(chown独有)—————————– 仅当文件的当前所有者和/或组匹配指定值时,才更改其所有权 |
| –reference=<参考文件> | 使用参考文件的所有者和所属组来设置目标文件,而不是自己指定 |
使用示例
-
将file.txt的所有者更改为用户alice
sudo chown alice file.txt -
更改文件的所属组
使用chgrp:
sudo chgrp newgroup file.txt使用chmod:
sudo chown :newgroup file.txt -
将file.txt的所有者设置为newuser,所属组设置为newgroup
sudo chown newuser:newgroup file.txt -
将目录
/var/www/html及其下所有文件和子目录的所有者和所属组都设置为名为www-data的用户和组sudo chown -R www-data:www-data /var/www/htmlwww-data是Linux中常用的Web服务器(比如 Apache、Nginx)运行的用户和组
mkdir —— 创建目录文件
语法格式
mkdir [参数] <目录名1> <目录名2>...
Linux的umask权限控制
在Linux中,每个新创建的目录或文件都会根据当前的umask值决定其默认权限
umask是权限掩码,它会从默认的最大权限中"减去"(实际不是减法)指定的值,结果就是新建文件或目录的默认权限:
默认权限 = 最大权限 - umask
umask有四位,通常我们设置umask只关注后三位(用户、组、其他),第一位用于以下特殊权限控制:
| 权限位 | 名称 | 作用 |
|---|---|---|
| 4 | setuid | 文件以创建者身份运行(对文件) |
| 2 | setgid | 组权限继承(对目录) |
| 1 | sticky | 只有文件所有者可删除(对目录) |
但在大多数实际中,umask的第一位几乎都是 0
因为我们通常不通过umask控制特殊权限,而是用chmod +s、+t显式设置
对于目录,最大默认权限是 777;对于文件,最大默认权限是 666(因为默认不为新文件设置执行权限)
例如:
- umask 为 0022
- 新建目录的权限为 777 - 022 = 755
- 新建文件的权限为 666 - 022 = 644
可以使用umask命令查看当前掩码,也可以使用umask新值来设置,例如:
umask 0027
这将修改新建目录权限为750(777-027),文件权限为640(666-027)
这里需要解释一个误区:umask其实不是减法,而是按位操作,先对umask取反后与运算:
默认权限 = 最大权限 & (~umask)
比如上面的umask 0027,文件权限为 640(666-027),你会发现6-7不等于0,但按位计算就是对的
我们使用二进制表示,分别计算每一位:
| 类别 | 默认权限 (666) | umask (0027) | ~umask (按位取反) | 实际权限(按位与) |
|---|---|---|---|---|
| 所有者 | 110 | 000 | 111 | 110 (rw-) |
| 所属组 | 110 | 010 | 101 | 100 (r–) |
| 其他人 | 110 | 111 | 000 | 000 (—) |
合起来就是640,即rw-r-----
常用参数
核心功能
| 参数 | 功能说明 |
|---|---|
| -p | 递归创建 当需要创建的目录,其父目录尚不存在时,这个参数会自动创建所有不存在的父目录<br / |
| -v | 显示详细过程 每创建一个新目录,都会打印一条消息。 |
权限控制
| 参数 | 功能说明 |
|---|---|
| -m | 设置权限 在创建目录的同时,直接为其设定权限(例如 -m 755),忽略系统的umask默认值 |
使用示例
-
在当前位置一次性创建多个目录
mkdir docs images scripts -
创建多级目录,并显示创建过程
mkdir -pv dir1/dir2/dir3/ -
创建一个权限为
777的目录mkdir -m 777 dir
touch —— 创建空文件/更新文件的时间戳
touch有两个主要功能:
-
如果文件不存在,则创建一个新的空文件
-
如果文件已存在,则更新该文件的访问和修改时间戳为当前时间
语法格式
touch [参数] <文件名>
Linux文件时间戳
Linux系统为每个文件维护的三个主要时间戳:
- 访问时间 (atime): 最后一次访问(读取)文件内容的时间。
- 修改时间 (mtime): 最后一次修改文件内容的时间。这是我们用
ls -l默认看到的时间 - 更改时间 (ctime): 最后一次更改文件元数据(metadata,如权限、所有者)或内容的时间
touch命令的主要作用就是更新这些时间戳,特别是atime和mtime
常用参数
| 参数 | 功能说明 |
|---|---|
| -a | 只更改文件的访问时间(atime) |
| -m | 只更改文件的修改时间(mtime) |
| -c | 如果文件不存在,不创建新文件 |
| -r <文件> | 使用另一个文件的时间戳来更新目标文件,而不是使用当前时间 |
| -d <日期字符串> | 使用指定的日期字符串"YYYY-MM-DD HH:MM:SS"来更新时间戳 |
| -t <时间戳> | 使用指定的[CC]YYMMDDhhmm[.ss]格式的时间戳来更新 |
使用示例
-
创建多个空文件
touch read.md file.txt note.log -
更新一个已存在文件的时间戳
touch file.txt -
将new.txt的时间戳设置得和old.txt完全一样
touch -r old.txt new.txt如果
new.txt不存在,touch会创建new.txt文件,并将其时间戳设置为old.txt的时间戳 -
创建一个指定日期的文件
touch -d "2023-01-01 12:30:00" time.txt -
创建一个指定时间戳的文件
touch -t 202508011030.45 time.txt
find —— 在目录中搜索文件
find会递归地遍历指定的目录树,根据用户设定的条件来查找文件,并能对查找到的文件执行指定的操作
语法格式
find <起始路径> <表达式>
/ | \
<选项> <测试> <动作>
find命令的核心:表达式引擎
与其他命令使用简单参数不同,find命令的核心是一系列可以组合的表达式:
<选项> <条件> <动作>
- 测试(选项+条件):用来判断文件是否符合某个条件,例如按名称或大小匹配,如果符合,测试返回真
- 动作:指定对找到的文件执行什么操作,最常见的动作是打印路径、执行命令
- 操作符:用于组合多个测试,例如
-and(与),-or(或),-not(非)
整个find命令就是构建一个逻辑表达式,find会用这个表达式去测试路径下的每一个文件
常用参数
按名称/路径测试
| 参数 | 功能说明 |
|---|---|
| -name /PATTERN/ | 按文件名匹配(区分大小写),支持通配符*和? |
| -iname /PATTERN/ | 按文件名匹配(不区分大小写) |
| -path /PATTERN/ | 按完整路径(包含目录名和文件名)进行匹配 |
| -regex /PATTERN/ | 使用正则表达式匹配完整路径 |
按类型/大小/时间测试
| 参数 | 功能说明 |
|---|---|
| -type TYPE | 按文件类型查找f代表普通文件,d代表目录,l代表符号链接 |
| -size N[cwbkMG] | 按文件大小查找N是数字,+N表示大于N,-N表示小于N,N表示等于NN的单位:c(字节),w(字,2字节),b(块,512字节),k(KB),M(MB),G(GB) |
| -mtime N | 按修改时间查找N代表天数+N表示超过N天前修改,-N表示N天内修改,N表示正好第N天前修改 |
| -ctime N | 按状态改变时间查找 类似 -mtime,针对权限、所有者等属性变化时间 |
| -atime N | 按访问时间查找 类似 -mtime,针对最后访问时间 |
| -user NAME | 按文件所有者查找 |
| -group NAME | 按文件所属组查找 |
| -perm MODE | 按文件权限查找 支持数字(如 0755)或符号模式(如u=rwx,g=rx,o=rx)MODE表示权限正好等于,-MODE表示完全包含,/MODE表示任意一位包含 |
对结果执行的动作
| 参数 | 功能说明 |
|---|---|
| 打印出匹配文件的完整路径 这是 find的默认动作,通常可以省略 |
|
| -ls | 对匹配的文件执行ls -lids命令,显示详细信息 |
| -delete | 删除找到的文件 |
| -exec COMMAND {} ; | 对每个找到的文件执行指定的COMMAND命令{}会被替换为当前文件名,\;表示命令结束,必须转义! |
| -ok COMMAND {} ; | 与-exec类似,但在执行每个命令前会进行交互式确认 |
| -prune | 跳过指定目录,不进入递归查找 常用: find <起始目录> -path "<要排除的路径>" -prune -o <其他查找条件> <动作>如果要排除多个目录,可以写多个 -path ... -prune 条件组合 |
逻辑操作符
| 操作符 | 完整形式 | 功能说明 |
|---|---|---|
| -a | -and | 逻辑与(默认行为,可省略)表示两个条件都满足 |
| -o | -or | 逻辑或,表示只要满足任一条件即可 |
| ! | -not | 逻辑非,取反,表示不满足某个条件 |
| () | 无 | 组合多个条件表达式,用于改变默认的优先级,括号需加转义:\( 和 \) |
使用示例
-
在/log目录下,查找所有类型为普通文件且大小超过10MB的文件,并列出详细信息
find /log -type f -size +10MB -ls -
查找/etc目录下,最近7天内被修改过的所有文件
find /etc -mtime -7 -
查找/home下所有所有属于用户alice的,且权限为777的文件
find /home -type f -user alice -perm 777 -
在当前目录及其所有子目录下,查找所有以.log结尾的文件,并移动到/log中
find . -name "*.log" -exec mv -n {} /log/ \; -
找出所有包含了“main”这个词的C语言源文件
find . -type f -name "*.c" -exec grep -l "main" {} \; -
在/home下查找所有.txt和.png文件,但跳过其中的/log和/mod子目录,并打印出完整路径
find /home \( -path "./log" -o -path "./mod" \) -prune -o \( -name "*.txt" -o -name "*.png" \) -print\( -path "./log" -o -path "./mod" \) -prune:排除这两个目录-o:如果不是被剪枝的目录,则继续执行下一部分\( -name "*.txt" -o -name "*.png" \):查找 txt 或 png 文件-print:打印完整路径
最好使用括号包裹过滤和查找的条件,否则无法保证结果
cp —— 复制文件/目录
语法格式
cp [参数] <源文件1> <源文件2>... <目标文件名>
Linux文件属性
cp命令的很多参数都与文件属性相关,这些我们在上文大多都提到过:
- 每个文件和目录都有其所有者和所属组
- 每个文件都有读(r)、写(w)、执行(x)的权限 这些权限分别针对"所有者"、“所属组”、“其他人”
- 每个文件都有多个时间戳,最常用的是最后修改时间
常用参数
核心功能
| 参数 | 功能说明 |
|---|---|
| -r, -R | 递归复制 这是复制目录时必须使用的参数,它会复制该目录下所有的文件和子目录 最好使用 -R,它是更标准化的写法 |
| -i | 交互模式 在覆盖一个已存在的文件前,会先进行提示并要求用户确认 |
| -n | 不覆盖已存在的文件 如果在目标位置有同名文件,则跳过该文件的复制 |
| -u | 更新复制 仅当源文件比目标文件新,或者目标文件不存在时,才执行复制操作 |
| -v | 显示详细过程 列出每个正在被复制的文件名 |
| -p | 保留文件属性 复制时,使新文件保留源文件的权限、所有者、时间戳等属性 |
链接
| 参数 | 功能说明 |
|---|---|
| -d | 保留符号链接 当复制一个符号链接(软链接)时,直接复制链接本身,而不是它所指向的文件 |
| -l | 创建硬链接,而不是复制文件内容 |
| -s | 创建符号链接,而不是复制文件内容 |
| -a | 归档模式 这是一个强大的组合参数,通常等效于 -dR --preserve=all (在某些系统中是-pPR)它表示递归复制、保留链接、并保留所有文件属性,常用于备份 |
强制
| 参数 | 功能说明 |
|---|---|
| -f | 强制 如果目标文件已存在且无法打开进行写入,cp会先尝试将其删除,然后再复制 |
备份
| 参数 | 功能说明 |
|---|---|
--backup[=CONTROL]或 -b[=CONTROL] |
为每个已存在的目标文件创建一个备份 |
这个和-a参数不同,是用来备份目标位置同名文件的,防止误覆盖
CONTROL可选值:
| 值 | 说明 |
|---|---|
| none | 不进行备份(与不加--backup等效) |
| numbered | 使用编号方式备份文件,如:file~, file.~1~, file.~2~ 等 |
| existing | 如果之前使用的是numbered,则继续编号;否则使用 simple(见下) |
| simple | 简单备份,文件名加一个 ~ 号,如:file~ |
如果省略=CONTROL,则使用默认的备份方式,通常是existing
使用示例
-
递归复制整个文件夹到指定目录下,如果目标已存在则提示是否覆盖
cp -Ri dir1/ dir2/ -
复制文件到
/etc目录下,覆盖已有文件不再询问cp -f file /etc -
递归复制文件夹的内容到指定目录下,保留所有属性,只更新变动过的文件,并显示过程
cp -auv dir1/. dir2/注意这里使用的是
dir1/.而不是dir1/,区别在于前者不包括目录dir1本身,只包括其中内容 -
结合{},把file1复制为file1.bak
cp file1{,.bak}这里的命令展开就是
cp file1 file1.bak,是一个非常巧妙的缩写方法
mv —— 移动/重命名文件
语法格式
mv [参数] <源文件或目录>
mv的工作原理
mv行为根据操作是否在同一个文件系统内而有所不同
在同一个文件系统内移动
此操作几乎是瞬时完成的
mv并不会真的移动磁盘上的数据,它只是修改了文件的路径记录(inode中的指针),所以速度极快
在不同的文件系统间移动
这个过程的速度取决于文件的大小
例如从本地硬盘移动到U盘,此时mv无法只修改路径记录,它会执行一个完整的复制操作,将文件内容从源位置复制到目标位置,然后在确认复制成功后删除原始文件,实际上相当于先执行cp再执行rm
其实类似windows在不同盘符之间移动文件
常用参数
核心功能
| 参数 | 功能说明 |
|---|---|
| -i | 交互模式 在覆盖一个已存在的文件前,会先进行提示并要求用户确认,可以有效防止误操作 |
| -n | 不覆盖已存在的文件 如果在目标位置有同名文件,则跳过该操作 |
| -u | 更新 仅当源文件比目标文件新,或者目标文件不存在时,才执行移动操作 |
| -v | 显示详细过程 列出每个文件在移动前后的路径 |
强制
| 参数 | 功能说明 |
|---|---|
| -f | 强制 不经任何提示,直接覆盖已存在的目标文件,通常是默认行为,与 -i相反 |
备份
| 参数 | 功能说明 |
|---|---|
-b[=CONTROL] |
**备份 **在覆盖已存在的目标文件时,会为原目标文件创建一个备份 |
具体使用方法和cp命令该参数一致:cp备份
使用示例
-
重命名txt文件为jpg
mv file.txt file.jpg也可以使用
{}一步到位:mv file.{txt,jpg} -
将当前目录下所有以.log结尾的文件,一次性全部移动到logs目录中(结合通配符)
mv *.log logs/ -
移动文件,显示过程,并进行确认
mv -iv file dir/目录名称最好加上
/表示为目录,否则可能进行重命名操作(如果没有该目录的话) -
将目录移动到tmp目录下
mv dir/ /tmp/与
cp不同,mv在移动目录时不需要-r参数
rm —— 删除文件或目录
语法格式
rm [参数] <文件或目录>
Linux文件删除的重要特性
- 与Windows等图形界面的“移动到回收站”不同,
rm命令默认是永久性删除 - 一旦文件被
rm删除,通常情况下无法轻易恢复,使用时谨慎再谨慎!
常用参数
| 参数 | 功能说明 |
|---|---|
| -r, -R | 递归删除 这是删除目录时必须使用的参数,它会删除该目录下所有的文件和子目录 |
| -f | 强制删除 忽略不存在的文件,并且从不提示用户进行确认,即使文件是只读的,也会直接删除。 |
| -i | **交互模式 **在删除每个文件前都会进行提示并要求用户确认,可以有效防止误删 |
| -v | 显示详细过程,列出每个正在被删除的文件名 |
使用示例
-
删除目录下多个文件,每个文件删除之前询问**(结合通配符)**
rm -i *.tmp -
递归删除整个目录及其内容
rm -r old_project/ -
强制递归删除整个目录
rm -rf dir/这个命令组合会强制、无提示地删除一个目录及其全部内容!
这是一个极其危险的命令组合,常被戏称为“删库跑路”,一定要慎用!
rmdir —— 删除空目录
语法格式
rmdir [参数] <目录名>
rmdir 与 rm -r
rmdir是一个专门用来删除空目录的命令,如果目录中含有任何文件或子目录,rmdir命令都会执行失败并报错- 由于它只能删除空目录,所以它比
rm -r要安全得多
常用参数
| 参数 | 功能说明 |
|---|---|
| -p | **递归删除目录 **当子目录被删除后,如果其父目录也因此变成了空目录,则一并删除 依此类推,直到遇到非空目录为止 |
| -v | 显示详细过程 |
使用示例
-
删除一个空的目录
rmdir empty_dir -
递归删除空的嵌套目录
rmdir -p dir1/dir2/dir3- 首先删除
dir3目录 - 然后发现
dir2目录变空了,于是也删除dir2目录 - 最后发现
dir1目录也变空了,于是也删除dir1目录
通过一条命令,就可以清理掉一整条空的目录路径
- 首先删除
-
同时删除多个空目录
rmdir empty_dir1 empty_dir2/xxx/xxx
tar —— 文件归档与压缩工具
tar命令是Linux中用于打包归档和压缩/解压文件的核心工具
它的名称是 tape archive(磁带归档)的缩写,最初被设计用于将文件备份到磁带上,现在广泛用于将多个文件和目录打包成一个单独的文件
语法格式
tar命令的参数风格比较独特,其主选项通常不需要在前面加-,但为了统一和清晰,加上-也是完全兼容的
创建归档
tar [主选项][辅助选项] <归档文件名> <要归档的文件或目录...>
查看归档内容
tar [主选项][辅助选项] <归档文件名>
提取归档内容
tar [主选项][辅助选项] <归档文件名> [要提取的文件...]
归档与压缩
理解tar,需要先区分这两个概念
归档
这是tar的本职工作,它将许多文件和目录打包成一个单独的大文件(通常称为tarball,以.tar结尾)
这个过程不减小文件总体积,就像把很多零散物品放进一个大箱子里
压缩
这是减小文件体积的过程,由gzip, bzip2, xz等专门的压缩工具完成
通常,我们先用tar将文件归档成一个.tar文件,然后再用gzip等工具将其压缩成.tar.gz
tar命令提供了便捷的参数(-z, -j, -J),可以在一条命令内连续完成“归档”和“压缩”两个步骤
常用参数
主选项(必须选择其一)
| 参数 | 功能说明 |
|---|---|
| -c | 创建一个新的归档文件 |
| -x | 从归档文件中提取文件 |
| -t | 列出归档文件中的内容,但不提取 |
| -r | 向已存在的归档文件末尾追加文件 |
| -u | 更新。仅当文件比归档中的同名文件新时,才将其追加到归档中 |
辅助选项(常用)
| 参数 | 功能说明 |
|---|---|
| -f | 指定归档文件的名称 这个参数几乎总是必需的,并且通常放在参数组合的最后 |
| -v | 显示详细过程。在处理文件时,将其名称打印在屏幕上 |
| -z | 通过gzip进行压缩或解压,生成的文件通常以.tar.gz或.tgz结尾 |
| -j | 通过bzip2进行压缩或解压,生成的文件通常以.tar.bz2或.tbz2结尾 |
| -J | 通过xz进行压缩或解压,生成的文件通常以.tar.xz结尾 |
| -C | 指定一个目录,在解压时,tar会先切换到这个目录,再开始提取文件 |
| –exclude=PATTERN | 在归档时,排除掉匹配PATTERN模式的文件 |
使用示例
-
将file文件和dir1目录打包成一个名为archive.tar的归档文件,并显示过程
tar -cvf archive.tar file1.txt directory1/先写打包后的名称(
-f),再列举打包的文件 -
将两个目录打包并使用gzip压缩,生成archive.tar.gz
tar -czf archive.tar.gz dir1/ dir2/ -
不解压文件,只列出archive.tar.gz压缩包里包含哪些文件和目录
tar -tzf archive.tar.gz解压定要选择
-x,不选择就不会解压,只是预览 -
将archive.tar.gz解压到当前tmp/目录,并显示解压过程
tar -xzvf archive.tar.gz -C /tmp
ln —— 创建文件或目录的链接
ln的名称是 link 的缩写,用于为文件或目录创建链接
语法格式
ln [参数] <源文件>/<目录> <链接名>
硬链接 (Hard Link) vs. 符号链接 (Symbolic Link)
链接是Linux文件系统的一个重要特性,它允许一个文件拥有多个可访问的路径
ln命令能创建的两种不同的链接类型:硬链接和符号链接(也称软链接)
| 特性 | 硬链接 (Hard Link) | 符号链接 (Symbolic Link / Soft Link) |
|---|---|---|
| 本质 | 是同一个文件的多个别名,它们共享同一个inode号和数据块,除了路径不同外都共享 | 是一个独立的文件,其内容是另一个文件的路径,类似Windows的快捷方式 |
| inode号 | 与源文件相同 | 拥有自己独立的inode号 |
| 权限和访问控制 | 继承原文件权限 | 链接权限由链接自身决定(但一般是777),访问成功与否由目标文件的权限决定,同时也要考量是否能进入目标文件所在的目录(对该目录的执行权限) |
| 是否能识别为链接 | ❌用ls -l看不出是否为硬链接(除非看 inode) |
✅用ls -l明确显示为链接,如 link -> target |
| 跨文件系统 | ❌不能跨越不同的文件系统创建 | ✅可以跨越不同的文件系统创建 |
| 对目录操作 | ❌不能对目录创建硬链接 | ✅可以对目录创建符号链接 |
| 删除源文件后 | 链接文件依然有效,可以正常访问数据(直到所有硬链接都被删除) | 链接文件会失效,因为其指向的路径不再存在 |
常用参数
| 参数 | 功能说明 |
|---|---|
| -s | 创建符号链接(软链接),不加此参数则默认创建硬链接 |
| -f | 强制 如果目标位置已存在同名文件或链接,则先将其删除再创建 |
| -i | 交互模式 在覆盖(删除)已存在的目标文件前进行提示 |
| -v | 显示详细过程 显示每个成功创建的链接 |
使用示例
-
为file.txt创建一个名为hard_link.txt的硬链接
ln file.txt hard_link.txt可以使用
ls -i命令查看,会发现它们的inode号完全相同 -
在用户主目录下强制创建一个名为nginx_access.log的符号链接,指向Nginx的访问日志文件
ln -sf /var/log/nginx/access.log ~/nginx_access.log -
为/mnt/disk1这个目录创建一个符号链接
ln -s /mnt/disk1 ~/disk1_link执行
cd ~/disk1_link就等同于执行cd /mnt/disk1,和快捷方式是一个用法
file —— 辨别文件类型
file命令是Linux中一个用于探测并显示文件类型的工具
它不依赖于文件的扩展名,而是通过一系列的测试来确定文件的真实类型
语法格式
file [参数] <文件名>
Linux文件类型与“魔数”
在Windows系统中,文件类型通常由其扩展名(如.txt, .exe)决定
然而,在Linux中,文件扩展名主要是为了方便用户识别,系统本身并不依赖扩展名来判断文件类型
一个可执行文件可以没有任何扩展名!
file命令主要通过三种测试来判断文件类型:
- 文件系统测试:首先检查文件是否是目录、符号链接、Socket等内核已知的特殊文件
- 魔数测试:接下来,它会检查文件开头的几个字节,这部分字节被称为**“魔数”(Magic Number)**,几乎所有标准文件类型(如JPEG, PNG, ELF可执行文件)都有一个独特的、像“指纹”一样的魔数
- 语言测试:如果文件看起来像是一个文本文档,
file会尝试分析其内容,判断它可能是哪种编程语言的源码(如C, Shell, Python)或配置文件
常用参数
核心功能
| 参数 | 功能说明 |
|---|---|
| -b | 简介模式 不输出文件名,只输出文件类型描述 |
| -i | 以MIME类型格式输出,而不是人类可读的描述 例如输出 image/jpeg而不是JPEG image data... |
| -L | 跟随符号链接 默认情况下, file会报告这是一个符号链接;使用此参数,它会去分析链接指向的那个原始文件。 |
| -z | 尝试查看压缩文件内部的内容类型 |
文件列表控制
| 参数 | 功能说明 |
|---|---|
| -f <列表文件> | 从指定的列表文件中读取要检查的文件名列表,而不是在命令行上指定 |
使用示例
-
识别一个未知文件的类型
file unknown_file输出示例:
unknown_file: PNG image data, 1024 x 768, 8-bit/color RGB, non-interlaced -
file可以清晰地区分可执行的二进制文件和可读的文本文件# 查看bash程序的文件类型 file /bin/bash # 查看一个shell脚本的类型 file ~/.bashrc输出示例:
/bin/bash: ELF 64-bit LSB pie executable, x86-64...~/.bashrc: UTF-8 Unicode text -
查看符号链接及其指向的原始文件
# 先创建一个符号链接 ln -s /bin/bash ./my_bash_link # 默认行为:识别链接本身 file my_bash_link # 使用-L参数:识别链接指向的文件 file -L my_bash_link输出示例:
my_bash_link: symbolic link to /bin/bashmy_bash_link: ELF 64-bit LSB pie executable, x86-64... -
批量识别文件类型
file *
file拓展 —— MIME类型
什么是MIME类型
MIME(Multipurpose Internet Mail Extensions)类型,又称为媒体类型(Media Type),用于标识文件或数据的格式和性质
它最初为电子邮件附件设计,但现在广泛应用于HTTP协议、浏览器内容协商等
MIME类型的格式
type/subtype
type是主类型(比如text,image,application等)subtype是具体的格式(比如jpeg,png,json)
常见MIME类型
text
| 子类型(常见格式) | 说明 |
|---|---|
| plain | 纯文本内容,无格式修饰(如.txt文件) |
| html | HTML超文本标记语言(网页源代码) |
| css | 层叠样式表(网页样式) |
| csv | 逗号分隔值文本,常用于表格或数据库导出 |
| javascript / js | JavaScript脚本代码 |
| xml | 可被人类和机器读取的标签化数据格式 |
| markdown / md | Markdown标记语言,常用于文档编写 |
| yaml / yml | 简洁的配置文件格式,常用于开发与部署 |
image
| 子类型(常见格式) | 说明 |
|---|---|
| jpeg / jpg | 有损压缩的位图图像格式 |
| png | 无损压缩的位图图像格式,支持透明 |
| gif | 支持动画和透明的图像格式 |
| bmp | Windows位图图像格式,不压缩 |
| svg+xml | 可缩放的矢量图像,基于XML |
| webp | Google开发的高效图像格式,兼顾压缩率和质量 |
| ico | Windows图标格式 |
| tiff / tif | 高质量图像格式,常用于扫描、印刷 |
audio
| 子类型(常见格式) | 说明 |
|---|---|
| mpeg / mp3 | 有损压缩音频格式 |
| wav | 无损音频格式,体积大 |
| ogg | 开放格式音频容器 |
| aac | 高压缩率音频格式,常用于流媒体 |
| flac | 无损压缩音频格式 |
| opus | 适用于语音和流媒体的高效音频格式 |
| quicktime / mov | Apple开发的视频格式,兼容性强 |
video
| 子类型(常见格式) | 说明 |
|---|---|
| mp4 | 最常见的视频格式,压缩效率高 |
| mpeg | 老的视频格式,兼容性好 |
| ogg | 支持视频的OGG容器格式(如.ogv) |
| webm | Google开发的为网页优化的视频格式 |
| avi | 微软开发的老视频格式 |
| x-matroska / mkv | 多媒体容器格式,支持多轨音视频 |
application
| 子类型(常见格式) | 说明 |
|---|---|
| json | 结构化数据交换格式,广泛用于 API |
| xml | 结构化文档或数据 |
| Adobe的便携文档格式 | |
| zip | 常见的压缩文件格式 |
| x-www-form-urlencoded | HTML表单默认提交格式(键值对编码) |
| octet-stream | 二进制数据流,常用作通用下载类型(未知二进制数据) |
| msword | 旧版Microsoft Word 文档(.doc) |
| vnd.ms-excel | 旧版Microsoft Excel 表格(.xls) |
| vnd.openxmlformats-officedocument.wordprocessingml.document | 新版Office Word(.docx) |
| vnd.openxmlformats-officedocument.spreadsheetml.sheet | 新版Office Excel(.xlsx) |
| x-tar | .tar归档文件格式,用于打包多个文件 |
| x-7z-compressed | 7-Zip压缩格式(.7z) |
| x-rar-compressed | RAR压缩格式(.rar) |
| x-debian-package | Debian软件包格式(.deb) |
| x-executable | Linux/Unix可执行文件(无拓展名时也可用此类型) |
| x-shockwave-flash | Flash动画格式(已淘汰) |
| javascript | JavaScript代码**(部分浏览器仍使用application而非text)** |
multipart
| 子类型(常见格式) | 说明 |
|---|---|
| form-data | 用于上传文件的表单数据 |
| mixed | 多部分邮件体,每部分可以是不同类型 |
| alternative | 同一内容的多种表示(如 HTML 和纯文本版本的邮件) |
| byteranges | 用于分块下载/断点续传 |
message
| 子类型(常见格式) | 说明 |
|---|---|
| rfc822 | 标准电子邮件消息格式 |
| partial | 邮件的部分片段 |
| external-body | 邮件外部引用内容 |
font
| 子类型(常见格式) | 说明 |
|---|---|
| woff, woff2 | Web优化字体格式 |
| truetype / ttf | 常见字体格式 |
| opentype / otf | TTF的扩展格式,功能更丰富 |
| embedded-opentype | EOT字体,IE专用的Web字体格式 |