Linux基本指令(包含vim,用户,文件等方面)超详细

发布于:2025-06-12 ⋅ 阅读:(20) ⋅ 点赞:(0)

Linux 基本指令

前序

如果使用虚拟机

​ 在关机之前要先将虚拟机关闭

  • shutdown
    • -h --halt
      • Halt the machine(停止系统并关闭电源 加 now 会马上关机如果在服务器等环境中只是停止系统运行,不会直接切断电源)
    • -p --poweroff
      • Power-off the machine(默认)
    • -r --reboot
      • Reboot the machine(重启计算机)
    • -c
      • Cancle a pending shutdown(取消关机)

Vim

编辑器分为两种

  • 所见及所得(编辑模式)

  • 多模式(在不同模式下,可以左不同的事情)

设计理念

  • 组合
    • 例如在 Vim 中,“d” 表示删除,“j” 移动到下一行,组合 “dj” 表示删除当前行和下一
      行;“^” 代表行首,故组合 “d^” 表示删除到行首;“ " 代表行尾, " d " 代表行尾,"d "代表行尾,"d” 表示删除到
      行尾。而且我们还可以指定命令重复的次数:“dd” 表示删除光标所在行,“2dd” 或
      “d2d” 表示连续删除两行,效果和 “dj” 一致。
  • 简单,快捷

模式

Vim 有多种模式,最常用的是:普通(命令)模式、插入(编辑)模式和视图模式。这些模式之间可以相互转换,如下图所示:

  • 普通模式(Normal)

  • 视觉模式(又叫视图模式)

  • 插入模式

转化指令解释

  • 普通模式转插入模式
    • i (insert) : 在光标前面插入
    • a(after) : 在光标后面插入
    • I(大写) :在行首插入
    • A :在行尾插入
    • o(open) : 在下面另起一行插入
    • O : 在上面另起一行插入
  • 普通模式转视觉模式
    • v ( visual) :行选
    • [ctrl + v ] (v-Block) : 竖选

Normal模式

Normal 又叫命令模式,就是用来执行命令的模式。

  • 命令
    • 短命令
      • i a o等命令
    • 底部命令(长命令)
      • :wq[enter]

移动光标(motion 核心)

常用指令
  • h :向左移动

  • j : 向下移动

  • k:向上移动

  • i : 向右移动

  • [n] - : 向上移动 n 行

  • [n] + : 向下移动 n 行

  • :[n] ([n]G):移动到第n行

  • gg : 到文件的第一行

  • G : 到文件的最后一行

  • 0 : 将光标移动到行首

  • ^ : 移动到第一个非空白字符

  • $ : 行尾

  • w (word) : 下一个词首

    • W (与小写的w的划分方式不同 单词与单词之间以空白字符分割) : 下一个词首
  • b (before) : 上一个词首

    • B(同上): 上一个词首
  • t(to): t) 向后查找,将光标移动到)的前一个字符

    • T :T" 向前查找,将光标移动到 “ 的后一个字符
  • f(find):向后查找,将光标移动到)

    • F : T" 向前查找,将光标移动到 “

动作(action)

常用指令
  • d (delete) : 删除

  • y (yank) : 复制

  • c ( change): 删除并进行插入模式

  • u (undo) : 撤销

  • [ctrl ] + r (recovery) : 恢复
    -

  • p / P (paste) : 粘贴

将动作与移动进行组合
  • 删除(delete)文本

Vim 中的删除类似 Windows 中的剪切,会将删除的内容复制到 Vim 的"剪切板"中。

  • 复制(yank)文本

  • 修改文本

查找(正则表达式)

  • /pattern : 向下查找 pattern为正则表达式 可以简单先理解为要查找的字段
  • ?pattern:向上查找
  • n :移动到下一个匹配项
  • N : 移动到上一个匹配项

替换(substitude)

因为linux操作系统循序 最小前缀原则 所以 :q 和 :quit 等效

  • 格式:

    • 😒/pattern/substitute/选项 将匹配pattern的内容替换为substitute

    • 😒/pattern/substitute 只会替换光标所在行的第一个匹配项

    • 😒/pattern/substitute/g 替换光标所在行的所有匹配项 (g for globally)

    • :[m],[n]s/pattern/substitute/g 替换[m,n]行的所有匹配项

    • :%s/pattern/substitute/g 替换全文的所有匹配项

文本对象

action + textobj
文本对象与motion的区别

  • a(, a)
    • 包含边界
    • a{, a}
    • a[, a]
    • a<, a>
    • a’’
    • a’
    • ap (paragraph)
      • p的就是空行
  • i(, i)
    • 不包含边界
    • i{, i}
    • i[, i]
    • i<, i>
    • i’’
    • i’
    • ip (paragraph)
      • p的就是空行

多窗口

对文件的操作

常用指令
  • :w :将buffer里面的内容写入文件中,即保存
  • :q :退出
  • :q!:不保存退出
  • :wq :保存退出
  • 注意:[ctrl] + s 不是保存 ,而是进入僵死状态;[ctrl] + q 退出僵死状态

视图模式(visual)

批量注释
  • 原生方法

    • [ctrl] + v 切换为竖选模式
    • 选择要注释的范围
    • 输入I 切换为插入模式
    • 输入//
    • 输入ESC
  • 使用vimplus插件

    • gc :g表示转义 c comment 注释

    • gdc :注释一行 或者 解除注释一行(就是与motion 结合使用)

Linux模型(体系结构)

Linux 的体系结构源自于 Unix,主要分为三层,从内到外依次是:内核 --> 系统调用–> 应用层。

  • 内核(kernel)负责两个功能:管理计算机硬件资源;为上层应用程序提供运行环境。
  • 系统调用(system calls):内核给上层应用程序提供的接口。
  • 库函数(library routines):通常我们会把系统调用封装成库函数,主要的目的是方便程序员使用。系统调用往往设计得比较繁琐复杂,相对于系统调用而言,库函数的设计会更加友好。比如: malloc 、 free 、 printf 、 scanf 等。
  • shell 是一个命令行解释器,它读取用户输入,然后执行命令,然后等待用户的下一次输入。
    shell 拥有很多版本,我们将使用 bash(Bourne-again shell),它位于/bin/bash。

用户子系统命令

linux用户

  • root 根目录,超级用户 皇帝:拥有至高无上的权利
  • sudoer:管理员用户 安装unbantu时,创建的用户默认为sudoer
    • 可以使用sudo 临时提升自己的权利
    • 太监
  • 普通用户

命令

  • 查看所有用户

    • cat /etc/passwd

    • 每一行对应一条记录,每条记录有多个字段,字段之间以 : 分割。我们可以在5号手册中查看 passwd 文件的格式和规范:

  • 创建用户

    • useradd [选项] username

      • 常见选项

        • -m – create -home
          • 如果不存在,则创建用户目录
        • -s --shell
          • 用户的登录使用的shell
      • 例子

        • sudo useradd test1 这样创建的用户不会自动创建用户的家目录,默认的shell为sh

        • $ sudo useradd -m -s /bin/bash test2 这样创建的用户会自动创建用户的家目录,并可以指定使用哪个shell

  • 删除用户

    • userdel [选项] username

      • 常用选项:
      • -r, --remove 用户主目录中的文件将随用户主目录和用户邮箱一起删除。
    • 例子

      • sudo userdel test1 这样删除用户,不会删除用户的家目录和用户的邮箱。

      • $ sudo userdel -r test2 这样删除用户,会把用户的家目录和用户的邮箱一起删除。

  • 修改用户密码

    • man passwd passwd 命令用来更改用户账户的密码。普通用户通常只更改其自己账户的密码,而超级用户可以更改任何账户的密码。

    • passwd [选项] [username]

      • sudo passwd test1

      • sudo passwd root

  • 切换用户

    • su + 用户
  • 退出切换

    • exit

常用命令

查看帮助手册

使用 man(manual) 命令可以查看 Linux 内置的帮助手册。该手册分为多卷:第一卷是用来查看 shell 命令的;第二卷是用来查看系统调用相关信息的;第三卷是用来查看库函数信息的…

  • man命令

    • man [手册编号] cmd
    • man man
    • man 3 mkdir
  • 进入帮助页面后,我们可以按照按下面按键进行操作

    • d(down) 向下翻半页
    • u(up) 向上翻半页
    • f(forward) 向下翻一整页
    • b(backward)向上翻一整页
    • q ( quit ) 退出
    • 还有一点 在查看手册时,vim的motion指令也是兼容的

文件子系统

和 Windows 不一样,Linux是以树的结构来管理文件系统的。我们将树的根结点称为根目录,用 / 表示。

常见目录

在linux中,以分门别类的方式管理文件,也就是功能相似的文件放在同一目录下进行管理

  • /bin(binary) 存放可执行程序或者脚本文件
  • /sys(system)存放和系统相关的文件
  • /dev(device)存放设备文件
  • /etc 一般用来存放配置文件或者启动脚本
  • /lib(library)存放系统库文件
  • /var(variable)存放变化很快的文件,比如日志文件
  • /proc(process)存放进程相关数据
  • /root root用户的家目录
  • /home/{username} 普通用户的家目录

与目录有关的指令

查看当前工作目录(pwd)

  • pwd(print working directory)命令可以查看当前工作目录

改变当前工作目录(cd)

  • cd(change directory)命令可以改变工作目录
  • man cd
    • cd [选项] [directory]
    • cd #切换到家目录
    • cd /usr/lib #切换到/usr/libm目录
    • cd / #切换到 / 目录
    • cd ~ #切换到用户家目录
    • cd . # 切换到当前工作目录
    • cd … #切换到父目录
    • cd - #切换到上次目录
    • 注意:上次目录保存的环境变量OLDPWD中(可以通过env命令查看),他不是用栈结构管理的

创建目录(mkdir)

  • mkdir

  • man mkdir

    • mkdir - make directories

    • mkdir [选项] directory …

    • -p, --parents 如果父目录不存在,则创建父目录

    • mkdir dir

    • mkdir dir1 dir2 dir3

    • mkdir -p a/b/c r如果父节点不存在,则创建父节点

删除空目录(rmdir)

  • rmdir (remove directory) 只能用来删除空目录

  • man rmdir

    • rmdir - remove empty directories

    • rmdir [选项] dirctory…

    • -p, --parents 递归删除空目录

    • rmdir dir

    • rmdir dir1 dir2 dir3

    • rmdir -p a/b/c

通配符

  • 可以用来匹配单个或者多个字符

  • *: 匹配任意多个字符(包括0个)

  • ?: 匹配任意一个字符

  • 集合(类): [characters]匹配集合内任意一个字符。

  • [!characters]匹配集合外任意一个字符。 比如:[abc], [!abc], [0-9], [a-z], [0-9A-Za-z_]等

  • rmdir 命令可以和通配符一起使用 (通配符可以提升命令的威力):

  • rmdir dir? 例如:删除dira dir1

  • rmdir dir* 例如:删除dir开头的所有空目录

  • rmdir [!abc] 删除dir开头后面一个字符不为abc的空文件

查看目录内容(ls)

  • ls (list) 命令可以查看目录内容
  • man ls
  • ls - list directory contents
    • ls [选项] [FILE]…
    • -a, --all 显示所有的内容,包括以.开头的文件和目录
    • -i, --inode 显示文件的inode编号(inode是物理文件的标识)。
      • 显示文件 通过 inode 编号找到物理文件进行访问
    • -l 以长格式的形式显示目录中的内容
    • -h, --human-readable 和-l选项一起使用,以人类可读的方式显示文件的大小。
  • 常见方式
  • ls # 查看当前工作目录
  • ls dir # 查看dir
  • ls dir1 dir2 dir3 # 查看dir1,dir2,dir3
  • ls -a dir # 查看dir中的所有内容,包括以.开头的文件和目录
  • ls -ilh dir # 显示inode编号,显示详细信息,并以人类可读的方式显示文件的大小
查看目录项的详细信息

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 第一列的第一个字母来表示文件的类型
    • -: 普通文件
    • d(directory): 目录
    • c(character): 字符设备文件(鼠标,键盘,显示器…
    • b(block): 块设备文件(磁盘)
    • l(symbolic link): 符号链接
    • s(socket): 本地套接字
    • p(named pipe): 有名管道
  • 第1列后面九个字符(分为3组)表示权限。
    • 依次代表拥有者、拥有组和其他用户的读、写、执行权限。可读则显示r,可写则显示w,可执行则显示x, 没有相关权限则显示-。 可以使用3个二进制数字表示 写1表示存在,写0表示-
  • 第2列表示硬链接数。 显示文件 通过 inode 编号找到物理文件进行访问
  • 第3列表示拥有者。
  • 第4列表示拥有组。
  • 第5列表示文件所占空间的大小。
  • 第6列表示最近修改时间。
  • 第7列为文件名。

以树状结构显示目录内容(tree)

tree 命令不是Linux系统自带的命令,使用之前,我们必须先安装 tree 命令

  • sudo apt install tree

tree 命令可以以树状结构显示目录内容

  • man tree
  • tree - list contents of directories in a tree-like format.
  • tree [选项] [directory]…
    • tree # 以树状结构显示当前工作目录的内容
    • tree dir # 以树状结构显示目录dir中的内容
    • tree dir1 dir2 dir3 # 以树状结构显示目录dir1, dir2, dir3中的内容

复制文件或目录(cp)

cp(copy) 命令可以用来复制文件和目录。

  • man cp

  • cp - copy files and directories

  • cp [选项] source dest

  • cp [选项] source… dest

  • 常用选项:

    • -n, --no-clobber 如果文件已存在,则不覆盖(默认会覆盖已有文件)。
    • -i, --interactive 如果文件存在,则给用户提示信息(由用户决定是否覆盖?)
    • -R, -r, --recursive 递归复制(用于copy目录)
  • cp text1 text2 # 将text1复制到text2中;如果text2存在,则覆盖。

  • cp text1 text2 text3 dir # 将text1,text2,text3复制到目录dir中;如果文件已存在,则覆盖。

  • cp -n text1 text2 # 将text1复制到text2中;如果text2存在,不覆盖。

  • cp -i text1 text2 text3 dir # 将text1,text2,text3复制到目录dir中;如果文件已存在,则提示用户是否覆盖。

  • cp -r dir1 dir2 # 递归地将目录dir1复制到目录dir2

文件和目录的移动或重命名(mv)

mv(move) 命令可以用来移动文件和目录,我们也可以用 mv 命令对文件和目录重命名。

  • man mv
  • mv - move (rename) files
  • mv [选项] SOURCE DEST
  • mv [选项] SOURCE… DEST
  • Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.
  • 常用选项:
  • -n, --no-clobber 如果文件已存在,则不覆盖(默认会覆盖已有文件)。
  • -i, --interactive 如果文件存在,则给用户提示信息(由用户决定是否覆盖?)

为什么移动目录时,不需要指定-r选项?

本质是修改目录的元数据(如路径、名称),而非复制内容。目录作为一个整体(包含其下所有文件和子目录的结构)直接被 “搬迁”,无需递归遍历内部内容(类似文件重命名,只是对象是目录)

mv text1 text2 # 将text1重命名为text2;如果text2存在,
则覆盖。
mv dir1 dir2 # 将dir1重命名为dir2
mv -n text1 text2 # 将text1重命名为text2;如果text2存在,
不覆盖。
mv text1 text2 text3 dir # 将text1,text2,text3移动到目录dir中;
如果文件已存在,则覆盖。
mv -i text1 text2 text3 dir # 将text1,text2,text3移动到目录dir中;
如果文件已存在,则提示用户是否覆盖。

删除文件和目录(rm)

rm(remove)命令可以删除文件和目录

$ man rm
rm - remove files or directories
格式:
rm [选项] FILE...
常用选项:
-f, --force
忽略不存在的文件,永远不提示
-i
在每次删除前,都提示用户是否删除
-r, -R, --recursive
递归删除

常用方式

$ rm text1 # 删除文件text1
$ rm text1 text2 text3 # 删除文件text1, text2, text3
$ rm -i *.txt # 删除当前目录下所有以.txt结尾的文件,并提示用户是否删除
$ rm -rf dir # 递归删除目录dir, 不给出任何提示

mv的本质是将text1,进行复制一份与inode进行关联,然后将原来的text1,删除。

注意:使用rm命令删除文件和目录后,就很难恢复了(Linux系统没有所谓的回收站)。所以除非必要,不要以 root 身份或者使用 sudo 权限来执行 rm 命令!

文件相关指令

创建文件

在linux下创建文件的方式有很多,常用的是以下三种方式:

$ echo "Hello Linus Torvalds" > text 	# 创建文件text, 并且文件中包含内容"Hello Linus Torvalds"
$ touch text1 text2 text3 				# 创建空文件text1, text2, text3(要求text1,text2,text3不存在)
$ vim hello.c 							# 编辑hello.c, 按:wq退出。

查找文件

which

使用which命令来查找可执行程序的路径

$ man which
	which - locate a command
格式:
	which [-a] cmd...
选项:
	-a    显示所有匹配的路径    不加 -a 会找到一个之后直接返回打印到屏幕上

常用方式

$ which bash # 查看bash的路径
$ which ls tree # 查看命令ls和tree的路径
$ which -a vim # 查看vim的所有路径 (我们可能装了多个版本的vim)

which 是根据 PATH环境变量中的路径依次进行查找的,然后显示第一个匹配项,或者显示全部匹配项

在这里插入图片描述

每条之间的分隔为:,依次查找

find

find可以在一个目录中递归的查找符合指定条件的文件。它的功能非常强大。

$ man find
	find - search for files in a directory hierarchy
格式:
	find [start-point...] 查找条件 # 省略start-point,默认起始点为当前工作目录
常用选项:
	-name pattern	查找文件名符合pattern(正则表达式)的文件
	-type c			查找类型为c的文件:
			b(block): 块设备文件
			c(character): 字符设备文件
			d(directory): 目录
			p(named pipe): 有名管道
			f(file): 普通文件
			l(symbolic link): 符号链接
			s(socket): 套接字
	-size n[cwbkMG] 	(向上查找)
		File uses n units of space, rounding up.
			b: for 512-byte blocks (this is the default if no suffix is used)
            c: for bytes
            w: for two-byte words
            k: for Kibibytes (KiB, units of 1024 bytes)
            M: for Mebibytes (MiB, units of 1024 * 1024 = 1048576 bytes)
            G: for Gibibytes (GiB, units of 1024 * 1024 * 1024 = 1073741824 bytes)
		可以在n前面添加'+'和'-',表示大于和小于。
	-empty			查找空的文件或空的文件夹
	-user username, -uid uid  	根据用户名和用户id查找
	-group groupname, -gid gid	根据组名和组id查找
	-perm mode					根据权限查找
	根据时间查找:
	-amin n, -atime n, -cmin n, -ctime n, -mmin n, -mtime n
		三个时间戳		
		a(access): 文件访问的时间
		c(change): 文件属性发生改变的时间 (用户,组 ,权限)
		m(modify): 文件内容发生改变的时间
		min: 以分钟为单位
		time: 以天为单位
		可以在n前面添加'+'和'-',表示大于和小于。
	组合查找:
		-a(and), -o(or), !(not): 分别表示与、或、非

“+” " - " 号的理解:

常用的方法

$ find /usr/include -name "stdio.h" 	# 在/usr/include目录下查找stdio.h文件
$ find . -name "*.c" 					# 在当前工作目录下查找所有以.c结尾的文件
$ find /dev -type b 					# 在/dev目录下查找所有的块设备文件
$ find . -size 5M 						# 在当前工作目录下查找所有大小为5M的文件
$ find . -size +5M						# 在当前工作目录下查找所有大于5M的文件
$ find dir1 dir2 dir3 -empty 			# 在dir1,dir2,dir3目录下查找所有空的文件和空的文件夹
$ find . -user he 						# 在当前工作目录下查找he用户拥有的文件
$ find . -gid 0 						# 在当前工作目录下查找root组(gid=0)拥有的文件
$ find . -perm 664 						# 在当前工作目录下查找权限为664(rw-rw-r--)的文件
$ find . -mtime 1 						# 在当前工作目录下查找在[1, 2)天前内容发生修改的文件 (find会省略小数部分)
$ find . -mtime +2 						# 在当前工作目录下查找在[3, )天前内容发生修改的文件
$ find /dev -type c -a -name "tty*" 	# 在/dev目录下查找以tty开头的字符设备文件
$ find /dev -type b -o -name "tty*"	 	# 在/dev目录下查找块设备文件或者是以tty开头的文件
$ find /dev -type c -a ! -name "tty*" 	# 在/dev目录下查找不以tty开头的字符设备文件

查看文件内容

cat
$ man cat
	cat - concatenate files and print on the standard output
格式:
	cat [选项] [file]...
常见选项:
	-n, --number		对每一行进行编号

常见用法

$ cat /etc/passwd
$ cat -n /etc/passwd
$ sudo cat /etc/passwd /etc/shadow (已拼接的方式查看) 这里加sudo因为shadow存储的为密码,所以普通用户不能查看
head

查看文件的前几行

$ man head
	head - output the first part of files
格式:
	head [选项] [file]...
常见选项:
	-n, --lines=[-]NUM		显示前NUM行;若在NUM前面添加'-'号,则显示除了后NUM行的所有行

常见用法

$ head text1 				# 显示text1的前10行
$ head text1 text2 text3 	# 显示text1,text2,text3的前10行
$ head -n 5 text1 			# 显示text1的前5行
$ head -n -5 text1 			# 显示除了最后5行的所有行
tail

查看文件的后几行

$ man tail
	tail - output the last part of files
格式:
	tail [选项] [file]...
常见选项:
	-n, --lines=[+]NUM	显示后NUM行;若在NUM前面添加'+'号,则从第NUM开始显示
	-F					显示后面追加的数据。一般用于查看日志文件。

-F 指令可以用于多窗口操作,查看不会关闭,如果在其他窗口,对文件进行改变,该命令会一直显示文件变化情况。

常见用法

$ tail text1 					# 显示text1的后10行
$ tail text1 text2 text3 		# 显示text1,text2,text3的后10行
$ tail -n 5 text1 				# 显示text1的后5行
$ tail -n +5 text1 				# 从第5行开始显示
$ tail -F server.log 			# 显示后10行,并且会显示后面追加的数据
less(more)
$ man more
	more - file perusal filter for crt viewing (说人话就是单页浏览)
格式:
	more [选项] file...

提示:less是more的高级版本,若系统中没有less命令,才会考虑使用more

常见用法

$ less text1 		# 浏览text1
$ less text1 text2 	# 浏览text1, text2

进入浏览界面后

f(forward) 		往后翻一页
b(backward) 	往前翻一页
:n(next) 		查看下一个文件
:p(previous)	查看上一个文件
q(quit) 		退出浏览界面

重定向

cat, head, tail等命令经常和重定向一起使用,比如:tail -n 20 text1 > a.txt。重定向的示意图如下:

默认情况下,stdin(标准输入)是与键盘相互绑定的,stdout stderr 与屏幕绑定。

在讲重定向之前,我们需要引入文件描述符的概念(后面我们会详细讲解这个概念,现在我们只需要知道它是一个非负整数即可)。

一个 > 表示追加重定向 >> 就表示重定向 会将原来的内容进行覆盖

常见用法

$ who > users
$ echo "liu yi fei" >> users
$ wc -l < users
$ cat users file1 > text 		# file1不存在
$ cat users file1 2> text 		# file1不存在
$ cat users file1 >& text 		# file1不存在

wc 命令 watch count 查看行数 两条命令的区别

搜索文件内容

grep

grep(globally search for a regular expression)命令可以用于搜索文件内容,它的功能非常强大!grep 命令会按正则表达式去搜索文件,如果文件中某一行匹配指定的正则表达式,grep命令则会显示这一行。

$ man grep
	grep - print lines matching a pattern
格式:
	grep [选项] pattern [file]...
常见选项:
	-E, --extended-regexp		使用扩展的正则表达式
	-i, --ignore-case			忽略大小写
	-v, --invert-match			显示不匹配正则表达式的行
	-n, --line-number			显示行号
	-c, --count					不显示匹配的行,显示匹配行的个数

常见用法

$ grep -nE "firmament" The_Holy_Bible.txt   # 显示The_Holy_Bible.txt中包含"firmament"的所有行,并显示行号
$ grep -cvE "firmament" The_Holy_Bible.txt  # 统计The_Holy_Bible.txt中不包含"firmament"的行数

正则表达式

正则表达式语法有点复杂,而且不同的工具使用的语法还不尽相同。下面我们介绍一些常用的正则表达式语法规则:

1. 基本单位
		基本单位主要包含:字符、转义字符、.(匹配任意一个字符)、集合(比如,[abc],[^abc])(expr)
2. 基本操作
		操作的对象是基本单位,主要包含两个基本操作:连接和重复
			a. 连接:"ab", "[abc]x", ".txt", "\.txt"
			b. 重复
                +: 重复至少一次(>=1), 比如:"abc+", "[abc]+"
                ?: 重复零次或一次(0|1), 比如:"abc?", "[abc]?"
                *: 重复任意次数(>=0), 比如:"abc*", "[abc]*", ".*"
                {m}: 重复m次
                {m,n}: 重复m到n次([m,n])
                {n, }: 至少重复n次([>=n])
3. 指定基本单位出现的位置
        ^: 行首,比如:"^abc"
        $: 行尾,比如:"xyz$"
        \<: 词首        默认以空白字符分割
        \>: 词尾

(expr) expr 为正则表达式 ()表示一个单位

对 \ . txt 的理解 因为 .在正则表达式中为元字符 ,加\ 进行转义后,变为 普通字符 .

Q: 以f开头,以t结尾的单词的正则表达式如何写?(单词之间以空格分隔)

\<f[^ ]*t\>       #中间字符非空格重复任意次数 

命令的组合

|(管道)

grep 命令之所以强大,主要在于它可以和其它命令组合使用。命令的组合主要有以下三种方式:

1. cmd1 ; cmd2
		先执行cmd1,再执行cmd2。如:mkdir dir; cd dir
2. cmd1 | cmd2 (管道)
		将上一个命令的输出作为下一个命令的输入。如:history | tail -n 20
3. cmd1 | xargs cmd2
		xargs(extended arguments) 可以将标准输入里面的每一行转换成命令的参数
		xargs往往和管道一起使用,如:cmd1 | xargs cmd2,它把cmd1输出的每一行作为cmd2的参数
	find . -name "*.c" | xargs grep -nE "\<main\("

管道是进程之间进行通信的一种方式,是内存中的,由内核管理的数据结构。

xargs 是将管道搜索到的内容作为命令行参数 可以理解为上面 加一大堆的的.c 文件,如下面第一行所示。

在这里插入图片描述

改变文件权限

chmod

chmod 命令可以改变文件和目录的权限。

目录:本质就是一个文件。 这个文件的内容是一个一个目录项(directory entry),在逻辑上,目录项之间是用链表的方式链接起来的。

每个目录项都是由一条单链表连接起来的。

权限对于普通文件和目录文件而言,其含义是不太一样的:

普通文件
r: 可读
w: 可写
x: 可执行 (可执行程序和脚本文件需要x权限才能直接运行)
目录
r: 可读 (ls)
w:可写 (在目录下添加和删除文件)
x: 可执行 (cd,读写权限依赖于x权限,所以目录一般都设置了x权限)

目录本质上一个文件 文件里面的内容为一个个目录项,逻辑上链表的形式衔接,读可不可以查看,写修改,x最基本 不能切换到该目录项 如cd操作等

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

chmod 目录的用法如下:

1. 文字设定法 (较少使用)
    chmod [ugoa][+=-][rwx] file/dir
    u: user
    g: group
    o: other
    a: all
    +: 添加权限
    -: 删除权限
    =: 将权限设置为
2. 数字设定法 (常用)
    chmod mode file/dir
    mode: 三位八进制数字

常见用法

$ chmod o+w text1
$ chmod u=rwx,g=rx,o=r text1
$ chmod 664 text1

文件创建掩码

umask

文件和目录在创建的时候都有一个默认的权限,该权限是由文件创建掩码 umask 决定的。
我们可以用 umask 命令查看当前的文件创建掩码:

$ umask
	0002 # 当前的文件创建掩码为2

创建文件 text 和目录 dir,查看它们的权限:

$ ls -l
drwxrwxr-x 2 he he 4096 312 20:55 dir/
-rw-rw-r-- 1 he he 0 313 20:34 text

可见当 umask = 0002 时,目录的默认权限为 775,文件的默认权限为 664

将文件创建掩码 umask 设置为 0023

$ umask 0023

再创建文件 text1 和目录 dir1,查看它们的权限

$ ls -l
drwxr-xr-- 2 he he 4096 313 20:40 dir1
-rw-r--r-- 1 he he 0 313 20:40 text1

可见当 umask = 0023 时,目录的默认权限为 754,文件的默认权限为 644

那么文件创建掩码是怎么进行工作的呢?

​ 主要看umask后三位 后三位设置的想去掉的权限 工作原理不是相减,对umask进行按位取反,然后再按位与,文件按位与666(因为文件没有执行权限,cd不进去),目录按位与777(读写执行)

目录:777 & (~umask)
文件:666 & (~umask)

链接

ln

我们可以用 ln 命令创建硬链接和符号连接(软链接)。

Inode 磁盘上文件的唯一标识

创建硬链接

$ ln text1 h_link
$ ls -li
    268648 -rw-r--r-- 2 he he 0 313 20:40 h_link
    268648 -rw-r--r-- 2 he he 0 313 20:40 text1

​ 可见 text1 和 h_link 是指向同一个文件的,并且硬链接数也由原来的 1 变成了 2。删除 text1 或 h_link 只会减少硬链接数,当链接数为 0 的时候,才会真正删除磁盘上的文件。(使用的是引用计数技术)

$ rm text1
$ ls -li
	268648 -rw-r--r-- 1 he he 0 313 20:40 h_link # 硬链接数变为了 1
$ rm h_link

创建符号链接(软链接)

$ ln -s text s_link
$ ls -li
    268648 lrwxrwxrwx 1 he he 4 313 21:24 s_link -> text # s_link文件的内容为text,因此大小为4
    264859 -rw-rw-r-- 1 he he 0 313 20:34 text

文件大小为4,存放的就是text4个字符,1111表示为软硬链接的标识,建立一个硬链接就会变为2,就相当于连了几根线在inode上。

image-20250603114706795

可见 text 和 s_link 是指向不同文件的,text 的硬链接数不会发生改变。删除 text 会导致符号链接 s_link 悬空:

$ rm text
$ ls -li
	268648 lrwxrwxrwx 1 he he 4 313 21:24 s_link -> text # 颜色会发生改变

硬链接与软链接的原理如图

我们可以将符号链接和 Windows 系统上的快捷方式,或者 C 语言中的指针做类比。
对于大多数命令(rm除外),如果参数是符号链接,其实操作的是符号链接指向的文件(类似指针的解引用操作):

$ echo "I love xixi\n" > text
$ cat s_link
	I love xixi
$ rm s_link # 删除符号链接

远程复制

scp

scp 命令可以用于上传和下载文件

上传:将本地的文件复制到远程
下载:将远程的文件复制到本地

scp 的用法和 cp 非常类似

$ man scp
	scp -- secure copy (remote file copy program)
格式:
	scp [选项] SRC... DEST
	本地路径:可以用绝对路径,也可以用相对路径
	远程路径:用户名@IP:路径
常用选项:
	-r		递归复制整个目录

常见用法

$ scp he@IP:~/text1 . 	# 将he用户家目录下的text1文件下载到当前工作目录
$ scp ./file he@IP:~ 	# 将当前工作目录下的file文件上传到he用户的家目录下

打包压缩

tar(text archive)

我们可以用 tar 命令打包和压缩文件。tar 是一个非常有历史的工具,这里我们只介绍它的传统(经典)用法:

格式:
tar [主选项+辅选项] 包名 [文件或目录]...
主选项(有且只能选择其中一个):
    c: 创建
    r: 追加
    x: 释放
辅选项:
    f: 指定包文件的名称
    v: 显示详细信息
    z: 使用gzip算法压缩或解压缩包文件

常见用法

$ tar cvf package.tar text*
$ tar rvf package.tar The_Holy_Bible.txt
$ tar xvf package.tar
$ tar czvf package.tar.gz *
$ tar xzvf package.tar.gz

别名

alias

有些命令比较长,自然我们就想给这些命令起一个别名,方便以后使用,alias 命令就是用来做这事情的。

$ man alias
alias — define or display aliases
格式:
alias [命令=别名]...

常见用法

$ alias # 查看别名
    alias g++11='g++ -std=c++11'
    alias ll='ls -alF'
    alias ls='ls --color=auto'
	...
$ alias h='history' # 设置别名

网站公告

今日签到

点亮在社区的每一天
去签到