查找指令

find <指定目录> <指定条件(可含正则表达式)> <指定动作>

当什么参数都不加,find默认搜索当前目录及其子目录,从磁盘中实时查找,因此查找出来的结果是最新的

  1. find . -name 'my*' # 搜索当前目录及其子目录中,所有文件名以my开头的文件
  2. find . -name 'my*' -ls # 搜索当前目录中,所有文件名以my开头的文件,并显示它们的详细信息。
  3. find . -type f -mmin -10 # 搜索当前目录中,所有过去10分钟中更新过的普通文件。如果不加-type f参数,则搜索普通文件+特殊文件+目录。

locate

不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),该数据库由系统自动创建,并每天自动更新一次。所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
默认系统不带该指令,需要手动安装

locate /etc/sh  # 搜索etc目录下所有以sh开头的文件。

locate ~/m   # 搜索用户主目录下,所有以m开头的文件

locate -i ~/m  # 搜索用户主目录下,所有以m开头的文件,并且忽略大小写。

whereis

whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。

whereis grep # 会把程序名为grep的二进制可运行文件, man说明文件,源代码文件都显示出来

whereis -b grep # 只显示二进制文件

whereis -m grep # 只显示man说明文件

which

which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
例:

which grep # 显示grep的可执行文件,和whereis -b grep等价

type

type命令其实不能算查找命令,它是用来区分某个命令到底是由shell自带的,还是由shell外部的独立二进制文件提供的。如果一个命令是外部命令,那么使用-p参数,会显示该命令的路径,相当于which命令。
例:

type cd # 系统会提示,cd是shell的自带命令(build-in)。

type grep  # 系统会提示,grep是一个外部命令,并显示该命令的路径。

type -p grep # 加上-p参数后,就相当于which命令。

查看磁盘/文件空间

df <类型>

df -k # 以字节为单位输出磁盘的使用量

df -h # 以更符合阅读习惯的方式显示磁盘使用量

df -T # 显示文件系统类型

ls <文件名>

image.png

du <文件名>

image.png
ls 和 du计算出的文件大小的区别在于,文件的底层磁盘占用是以block区分(再细分的话就是),这些块区域不一定是连续的,因此会出现不占满某个块的情况。ls计算的就是占用的所有块的总大小,而du计算的是块中实际内容的大小

定时任务

crontab

用于执行时间粒度为分的定时任务

进程运行

&,jobs,fg,bg,nohup

当需要使进程在后台运行时,可以在程序指令命令之后加&

./poll_server &

查看当前终端放入后台运行的工作

jobs -l # 使用-l参数还可以显示出进程的pid

使后台进程切换到前台运行

fg %1 # 注意这个%1是jobs显示出来的序号

使前台进程切换到后台运行

# 首先使用ctrl + z使之暂停运行,暂停之后的进程会变成stopped状态切换到后台

# 对于在后台stpped状态的进程,使用 bg %1即可使之恢复运行
bg %1

想要杀掉进程则使用kill -9 对应的进程号即可

kill -9 9427

当使用ssh连接到控制终端,且在这个控制终端上开启的非守护进程(比如httpd就是一个守护进程),均属于该sshd之下的子进程。在ssh断开之后系统会发出 SIGHUP 信号,对应sshd之下的进程都会被kill掉。
因此使用 nohup 可以使进程不被kill

nohup ./poll_server &  #运行在后台,且不接收SIGHUP信号

screen

创建进程并使之在screen中运行
screen -S <名称> <所要运行的程序>

screen -S myPoll ./poll_server

查看当前的所有screen

screen -ls

杀死某个screen
screen -S <名称/序号> -X quit

screen -S myPoll -X quit

进入某个screen
screen -r <名称/序号>

screen -r myPoll

注意,screen一次只能被一个用户连入,当需要强制顶替连入时,需要使用 screen -dr <名称/序号>
退出某个screen使用 ctrl + a + d

文件操作

文件删除

unlink系列

这里的“系列”指的是各组件工具的unlink函数,如Posix消息队列的mq_unlink、Posix信号量的sem_unlink、Posix共享内存的shm_unlink函数,这些函数都遵循:从文件系统删除文件名,如果该文件的引用计数不为0,则等到最后的引用释放之后,才会真正的删除该文件。

unlink text.txt

注意,不能删除文件夹

rm

rm text.txt 
rm -r test (文件夹)

底层使用的也是unlink,但是可以删除文件夹,因为底层是unlink,因此对于正在使用的文件只会删除他在文件系统的名字,而不是真正删除文件

cp

这个函数主要用来对文件进行复制,但是注意一种情况:如果目标覆盖文件是可执行文件,则会复制失败,提示**Text file busy**。对于普通的文件,不管该文件是否正在被写入/读取,都可以成功覆盖。

cp text2.txt text.txt

如果使用rm对正在执行的文件进行删除,然后再创建同名的新文件,就可以实现对可执行文件的替换了。因为底层的unlink机制,因此不会影响正在执行的可执行文件

文件属性设置

chattr 和 lsattr

chattr用以改变文件或目录的属性,操作的用户需要有 root 权限
lsattr用以显示文件或目录的属性

可选模式:
a:让文件或目录仅供附加用途。
b:不更新文件或目录的最后存取时间。
c:将文件或目录压缩后存放。
d:将文件或目录排除在倾倒操作之外。
i:不得任意更动文件或目录。//重点!!!!!!!
s:保密性删除文件或目录。
S:即时更新文件或目录。
u:预防意外删除。

语法结构:
chattr [-RV][-v<版本编号>][+/-/=<属性>][文件或目录...]

可选参数:
-R 递归处理,将指定目录下的所有文件及子目录一并处理。
-v<版本编号> 设置文件或目录版本。
-V 显示指令执行过程。
+<属性> 开启文件或目录的该项属性。
-<属性> 关闭文件或目录的该项属性。
=<属性> 指定文件或目录的该项属性。
rxsi@VM-20-9-debian:~/learncpp$ sudo lsattr ref.cpp
--------------e---- ref.cpp
rxsi@VM-20-9-debian:~/learncpp$ sudo chattr +i ref.cpp // 使不可修改
rxsi@VM-20-9-debian:~/learncpp$ sudo lsattr ref.cpp
----i---------e---- ref.cpp
rxsi@VM-20-9-debian:~/learncpp$ sudo chattr -i ref.cpp 
rxsi@VM-20-9-debian:~/learncpp$ sudo lsattr ref.cpp
--------------e---- ref.cpp

chmod

控制用户对文件的权限
Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。
image.png
r = 4, w = 2, x = 1

rxsi@VM-20-9-debian:~/learncpp$ ls -al array.cpp 
-rw-r--r-- 1 rxsi rxsi 686 Jan  2 00:13 array.cpp
rxsi@VM-20-9-debian:~/learncpp$ chmod 777 array.cpp 
rxsi@VM-20-9-debian:~/learncpp$ ls -al array.cpp 
-rwxrwxrwx 1 rxsi rxsi 686 Jan  2 00:13 array.cpp

文件拷贝

cp

一个指令是cp,它的做法是先清空文件,然后再往里面写入新文件内容,这个不会改变文件的句柄。但是对于正在运行的程序,如果是正在被 执行 的文件,那么会复制失败

install

该指令会先删除原先的文件然后再生成新文件,底层的删除流程依然是unlink指令,因此并不会影响正在运行的程序,新文件具有新的文件句柄
该指令的关键在于同时可以设置文件的权限,常用于makefile

--backup[=CONTROL]:为每个已存在的目的地文件进行备份。 
-b:类似 --backup,但不接受任何参数。 
-d,--directory:所有参数都作为目录处理,而且会创建指定目录的所有主目录。 
-D:创建<目的地>前的所有主目录,然后将<来源>复制至 <目的地>;在第一种使用格式中有用。 
-g,--group=组:自行设定所属组,而不是进程目前的所属组。 
-m,--mode=模式:自行设定权限模式 (像chmod),而不是rwxr-xr-x。 
-o,--owner=所有者:自行设定所有者 (只适用于超级用户)。 
-p,--preserve-timestamps:以<来源>文件的访问/修改时间作为相应的目的地文件的时间属性。 
-s,--strip:用strip命令删除symbol table,只适用于第一及第二种使用格式。 
-S,--suffix=后缀:自行指定备份文件的<后缀>
-t, --target-directory=目录 将源文件所有参数复制到指定目录
install -p -D -m 0755 targets /usr/bin/targets

socket连接统计

netstat

net-tools 是一套标准的 Unix 网络工具,用于配置网络接口、设置路由表信息、管理 ARP 表、显示和统计各类网络信息等等,但是这个工具已经不再更新,性能较差
常用参数有:

-a 显示所有活动的连接以及本机侦听的TCP、UDP端口
-l 显示监听的server port
-n 直接使用IP地址,不通过域名服务器
-p 正在使用Socket的程序PID和程序名称
-r 显示路由表
-t 显示TCP传输协议的连线状况
-u 显示UDP传输协议的连线状况
-w 显示RAW传输协议的连线状况
netstat -nat // 显示当前的TCP连接

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN     
tcp        0      0 10.0.20.9:55632         109.244.244.216:9988    ESTABLISHED
tcp        0    196 10.0.20.9:22            106.55.203.20:42476     ESTABLISHED
tcp        0      0 10.0.20.9:50226         169.254.0.138:8086      ESTABLISHED
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 :::33060                :::*                    LISTEN     
tcp6       0      0 :::3306                 :::*                    LISTEN     
tcp6       0      0 :::6379                 :::*                    LISTEN

ss

iproute 工具,用以代替性能低下的 netstat 工具,具有更快的性能。原因在于 netstat 是遍历 /proc 下面的 PID 目录(每个进程都会在此处生成映射文件,文件名是进程 PID),即是基于procfs文件系统
而 ss 是直接读 /proc/net 下面的统计信息,利用了 TCP 协议栈中的 NetLink下的tcp_diag子系统,采用的网络通讯的方式,以内核作为服务端接收客户端的进程查询请求,并以二进制数据包响应查询结果,因此效率更高
而如果系统没有该参数亦可运行,速度仍是高于 netstat

-a 显示服务器上所有的sockets连接,直接列出所有网络连接
-l 显示正在监听的网络端口
-n 显示数字IP和端口,不通过域名服务器
-p 显示使用socket的对应的程序
-t 只显示TCP sockets
-u 只显示UDP sockets
-4 -6 只显示v4或v6V版本的sockets
-s 查看当前服务器的网络连接统计,打印出统计信息。
-0 显示PACKET sockets
-w 只显示RAW sockets
-x 只显示UNIX域sockets
-r 尝试进行域名解析,地址/端口
ss -nat // 显示当前的TCP连接

State                     Recv-Q                    Send-Q                                       Local Address:Port                                           Peer Address:Port                     
LISTEN                    0                         128                                                0.0.0.0:22                                                  0.0.0.0:*                        
LISTEN                    0                         128                                                0.0.0.0:6379                                                0.0.0.0:*                        
ESTAB                     0                         0                                                10.0.20.9:55632                                       109.244.244.216:9988                     
ESTAB                     0                         0                                                10.0.20.9:22                                            106.55.203.20:42476                    
ESTAB                     0                         0                                                10.0.20.9:50226                                         169.254.0.138:8086                     
LISTEN                    0                         128                                                   [::]:22                                                     [::]:*                        
LISTEN                    0                         70                                                       *:33060                                                     *:*                        
LISTEN                    0                         128                                                      *:3306                                                      *:*                        
LISTEN                    0                         128                                                   [::]:6379                                                   [::]:*

文本操作

awk

用以对字符串进行分割

rxsi@VM-20-9-debian:~/kbengine$ echo "a/b/c/b/d/e" | awk -F "/b" '{print $0, $1, $2, $3}'

$0:原始字符串
$n:切割后的第n个字符子串

// 输出:
a/b/c/b/d/e a /c /d/e

替换

$(),``

用以实现命令替换,即会优先执行包含的命令行,然后将执行结果替换出来,再重新组成新的命令行。
不过使用```容易造成和‘’的混乱,因此优先推荐使用$()`,但这个方式不是所有的 Unix 系统都支持

rxsi@VM-20-9-debian:~$ echo today is `date "+%Y-%m-%d"`
today is 2022-06-13
rxsi@VM-20-9-debian:~$ echo today is $(date "+%Y-%m-%d")
today is 2022-06-13

${},$

用以实现变量替换,两个指令没有区别

rxsi@VM-20-9-debian:~$ A="abc"
rxsi@VM-20-9-debian:~$ echo $A
abc
rxsi@VM-20-9-debian:~$ echo ${A}
abc

还可以用来进行字符子串的切分

rxsi@VM-20-9-debian:~$ echo ${A:0:1}
a

查看链接库

ldd

查看可执行程序所链接的动态库
image.png