loading...
Featured image of post Linux命令(文件管理篇)

Linux命令(文件管理篇)

Linux中与文件管理有关的命令及基本知识

系统地学习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.txtfileA.txt,但不匹配file10.txt

ls file?.txt

中括号:[]

匹配[]内的任意一个字符或字符范围

匹配 file1.txtfile2.txtfile3.txt

ls file[123].txt

[]中使用连字符-表示字符范围

匹配 filea.txtfilez.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的合集)

ugo分别对应三个八进制权限码数值,利用三位数字组合我们就能表示出三类用户的权限,例如权限值 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.pem
    

    600权限(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/html
    

    www-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命令的主要作用就是更新这些时间戳,特别是atimemtime

常用参数

参数 功能说明
-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表示等于N
N的单位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表示任意一位包含

对结果执行的动作

参数 功能说明
-print 打印出匹配文件的完整路径
这是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
    
    1. 首先删除dir3 目录
    2. 然后发现dir2目录变空了,于是也删除dir2目录
    3. 最后发现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 [参数] <源文件>/<目录> <链接名>

链接是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命令主要通过三种测试来判断文件类型:

  1. 文件系统测试:首先检查文件是否是目录、符号链接、Socket等内核已知的特殊文件
  2. 魔数测试:接下来,它会检查文件开头的几个字节,这部分字节被称为**“魔数”(Magic Number)**,几乎所有标准文件类型(如JPEG, PNG, ELF可执行文件)都有一个独特的、像“指纹”一样的魔数
  3. 语言测试:如果文件看起来像是一个文本文档,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/bash my_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 结构化文档或数据
pdf 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字体格式
最后更新于 2025-08-27
距离小站第一行代码被置下已经过去
使用 Hugo 构建
主题 StackJimmy 设计
...当然还有kakahuote🤓👆