查找指令
find <指定目录> <指定条件(可含正则表达式)> <指定动作>
当什么参数都不加,find默认搜索当前目录及其子目录,从磁盘中实时查找,因此查找出来的结果是最新的
find . -name 'my*' # 搜索当前目录及其子目录中,所有文件名以my开头的文件find . -name 'my*' -ls # 搜索当前目录中,所有文件名以my开头的文件,并显示它们的详细信息。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 <文件名>

du <文件名>

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)。
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
查看可执行程序所链接的动态库
