=========================================================================
day01
1. Linux 多用户多任务操作系统
类 Unix 系统
2. Linux 命令提示符
shell 命令提示符:
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$
huangshaofeng ---- 用户名
@ ---- 分隔符
huangshaofeng-virtual-machine ---- 主机名
: ---- 分隔符
~ ---- 当前工作目录
$ ---- 权限、身份符号,超级用户使用 #
修改命令提示符,只要修改 PS1 环境变量即可:
以上只是临时更改,只对当前 SHELL 有效,如果要开机即生效,就要修改启动文件
.profile 或 .bashrc 中对 PS1 的赋值。
3. 系统中支持的 shell
查看系统中支持的 shell:
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/bin/rbash
/bin/dash
查看当前 shell:
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ echo $SHELL
/bin/bash
进入指定的 shell,输入相应 shell 名即可:
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ sh
$
退出 shell:
$ exit
4. Linux 根目录
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls /
bin etc lib media root srv usr
boot home lib32 mnt run swapfile var
cdrom initrd.img lib64 opt sbin sys vmlinuz
dev initrd.img.old lost+found proc snap tmp vmlinuz.old
bin 所有用户都可执行命令目录
boot 启动文件目录
dev 设备文件目录
etc 系统配置文件目录
home 普通用户主目录的父目录
lib 32 位库文件目录
lib64 64 位库文件目录
mnt 默认的挂载目录
opt 要挂载的文件系统等
proc 进程相关的信息
root 根用户(超级用户)主目录
sbin 超级用户执行的命令目录
sys sysfs 文件系统,比 proc 更详细
usr 普通用户目录,比如普通用户安装的命令
/usr/bin 命令目录
/usr/include 头文件目录
/usr/lib 库目录
/usr/sbin 超级用户命令
/usr/share/man 手册页主目录,子目录 man1 ~ man9 手册的各章节目录
var 配置目录
5. 绝对路径和相对路径
绝对路径:从根目录 / 开始的路径。如:/usr/include
相对路径:不以 / 开始的路径。因为它是相对于当前目录或上级目录的路径。如:
usr 当前目录下的 usr 目录
./usr 当前目录下的 usr 目录
../usr 上级目录下的 usr 目录
主目录(家目录),每个用户都有他的主目录,用于存放用户私有文件。
普通用户主目录:/home/xxxx ---- xxxx 用户的主目录
超级用户主目录:/root
两个特殊的目录:
当前目录:.
上级目录:..
每个目录下都有这两个目录。根目录 / 下也有 .. 目录名,但没有上级目录。
6. < 输入重定向
默认情况下,是从键盘输入数据,但如果不想从键盘输入,而想从一个文件中得到输入
的数据,则可以使用输入重定向 <,< 的左边是命令,右边是输入文件。
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ vi 1.txt
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ read AAAA <1.txt # < 右边的文件内容输入到左边命令中
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ echo $AAAA
1234
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$
7. > 输出重定向
默认情况下,是向控制台(屏幕)输出,但是如果想将输出保存到某个文件中,则可以
使用输出重定向 >,> 的左边是命令,右边是输出文件。如果文件不存在就自动创建。
如果文件已存在就覆盖原内容。
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ echo "hello world"
hello world
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ echo "hello world" >1.txt # 将 echo 命令的输出保存到 1.txt 文件中
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ cat 1.txt
hello world
标准输出文件描述符 1
标准错误文件描述符 2
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ find . -name "1.txt" 2>&1 # 将标准错误重定向到标准输出
如果要过滤掉一些错误的信息,可以使用将标准错误 2 重定向到 /dev/null
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ find /root -name "*.h"
find: ‘/root/snap’: 权限不够
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ find /root -name "*.h" 2>/dev/null
# 重定向了,错误信息保存到 /dev/null
8,>> 输出重定向追加
将输出到屏幕的数据输出到文件中,并且是追加到文件中。
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ echo "hello" >>3.txt
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
1.txt 3.txt
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ cat 3.txt
hello
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ echo "hello" >>3.txt
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
1.txt 3.txt
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ cat 3.txt
hello
hello
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$
9. 通配符 *, ?, [abcd], [^abcd], [a-z]
* 通配任意长度的字符。包括 0 个字符。
以 .txt 结尾可以用通配符表示为:*.txt
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c 1.txt 2.txt 3.txt
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls *.txt
1.txt 2.txt 3.txt
其它用法:abc*, 1*.txt, *abc*, *ab*cd*
? 通配有且仅有一个字符。
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c 1.txt 2.txt 3.txt
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls ?.txt
1.txt 2.txt 3.txt
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls ??.c
10.c
[abcd] 通配 [] 中列出的任意一个字符
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c 1.txt 2.txt 3.txt
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls [12].txt
1.txt 2.txt
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls [0-9].txt
1.txt 2.txt 3.txt
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$
ls [0-9a-zA-Z].txt # 通配所有数字和字母 ls [a-z].txt # 通配所有小写字母 ls [A-Z].txt # 通配所有大写字母 ls [a-zA-Z].txt # 通配所有字母
[^abcd] 排除集合中的字符,匹配一个字符。
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls [^45678].txt
1.txt 2.txt 3.txt
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls [^1-3].txt
ls: 无法访问'[^1-3].txt': 没有那个文件或目录
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls [^123].txt
ls: 无法访问'[^123].txt': 没有那个文件或目录
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ touch 4.txt
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls [^123].txt
4.txt
[] 通配符只匹配一个字符,如果要匹配多个字符,就要多次使用 [] 匹配:
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls [1-3][a-z].txt
1a.txt
10. 命令间使用 ; 分隔
命令行执行多条命令时,使用 ; 将它们分隔开来:
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ echo $PS1;cat 1.txt # 先执行 echo 命令,再执行 cat 合作
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$
hello world
11. # 注释
shell 命令中使用 # 注释,放在命令的末尾
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ echo "hello world" #This is remark
hello world
12. pwd 命令
显示当前工作目录的绝对路径
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ pwd
/home/huangshaofeng/mywork/linux1
13. cd 切换目录
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ cd # 回到家目录
huangshaofeng@huangshaofeng-virtual-machine:~$ cd ~ # 回到家目录
huangshaofeng@huangshaofeng-virtual-machine:~$ cd - # 切换回之前的目录
/home/huangshaofeng
huangshaofeng@huangshaofeng-virtual-machine:~$ cd ..
huangshaofeng@huangshaofeng-virtual-machine:/home$ pwd
/home
huangshaofeng@huangshaofeng-virtual-machine:/home$ # 切换到上级目录
huangshaofeng@huangshaofeng-virtual-machine:~/huaqing/day_2$ cd ../../../huangshaofeng/ # 切换上三级目录
~ 通配任何用户的家目录。
如果是 huangshaofeng 用户则表示 /home/huangshaodfeng
如果是 root 用户则表示 /root
14. ls 列出文件信息
默认情况下不显示隐藏文件(以 . 开头的文件)。
-a 所有文件(包含隐藏文件),包括 . 和 ..
-A 所有文件(包含隐藏文件),但不包括 . 和 ..
huangshaofeng@huangshaofeng-virtual-machine:~/huaqing/day_2$ ls -a
. .. first first.c work
huangshaofeng@huangshaofeng-virtual-machine:~/huaqing/day_2$ ls -A
first first.c work
-i 显示文件的 inode 号,inode 号相同的文件是同一个文件。
huangshaofeng@huangshaofeng-virtual-machine:~/huaqing/day_2$ ls -i
1342896 first 1342899 first.c 1342897 work
-l 长格式
huangshaofeng@huangshaofeng-virtual-machine:~/huaqing/day_2$ ls -l
总用量 20
-rwxrwxr-x 1 huangshaofeng huangshaofeng 8304 6月 29 14:33 first
-rw-rw-r-- 1 huangshaofeng huangshaofeng 74 6月 29 14:33 first.c
drwxrwxr-x 2 huangshaofeng huangshaofeng 4096 6月 29 14:36 work
以上每个文件的 7 个部分,每部分的意思:
drwxrwxr-x 第一个字母表示文件类型。有:
d 目录,- 常规文件,l 符号链接,b 块设备,c 字符设备,p 管道
2-4 三个字母表示“所有者”权限,r 可读,w 可写,x 可执行,并且位置固定。- 表示无权
5-7 三个字母表示“所属组”权限
8-10 三个字符表示“其它用户”权限
第二部分,如果是目录表示其下面的子目录个数(包含 . 和 ..),如果是文件则表示硬链接数目
第三部分,所有者名称
第四部分,所属组名称
第五部分,文件大小,对于目录表示所占磁盘空间;对于文件表示文件大小
第六部分,最后修改日期
第七部分,文件名
=========================================================================
day02
1. mkdir 创建目录
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c 1a.txt 1.txt 2.txt 3.txt 4.txt
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ mkdir d1 d2 d3 # 同时创建 3 个目录 d1 d2 d3
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c 1a.txt 1.txt 2.txt 3.txt 4.txt d1 d2 d3
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ mkdir d1/d11 d2/d22 # 创建子目录
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls d1/d11 d2/d22
d1/d11:
d2/d22:
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ mkdir d3/d31/d311
mkdir: 无法创建目录"d3/d31/d311": 没有那个文件或目录
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ mkdir -p d3/d31/d311
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls d3 -R
d3:
d31
d3/d31:
d311
d3/d31/d311:
2. rmdir 删除空目录
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls d1 d2 -R
d1:
d11
d1/d11:
d2:
d22
d2/d22:
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ rmdir d1/d11 d2/d22 # 删除两个子目录
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c 1a.txt 1.txt 2.txt 3.txt 4.txt d1 d2 d3
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls d1 d2 -R
d1:
d2:
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ rmdir d3
rmdir: 删除 'd3' 失败: 目录非空 # 非空目录不能删除
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ rmdir d3/d31/d311 -p # -p 选项删除路径中所有空目录
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c 1a.txt 1.txt 2.txt 3.txt 4.txt d1 d2
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ rmdir d* # 使用通配符删除以 d 开头的空目录
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c 1a.txt 1.txt 2.txt 3.txt 4.txt
3. cp 复制文件目录
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ cp /usr/include/stdio.h . # 复制文件到当前目录(.)
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c 1a.txt 1.txt 2.txt 3.txt 4.txt stdio.h
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ cp *.txt stdio.h d1 # 复制多个文件到 d1 目录,使用通配符 *
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls d1
1a.txt 1.txt 2.txt 3.txt 4.txt stdio.h
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ cp -t d2 *.txt
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls d2
1a.txt 1.txt 2.txt 3.txt 4.txt
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ cp -r d1 d3 # 复制目录,没有使用 -r 选项会报错 # 复制目录,要使用 -r 选项。注意目标目录 d3 此时不存在,
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls d3
1a.txt 1.txt 2.txt 3.txt 4.txt stdio.h
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ cp -r d1 d3 # 复制目录,此时 d3 已存在,则将 d1 复制到 d3 下面成为其子目录
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls d3
1a.txt 1.txt 2.txt 3.txt 4.txt d1 stdio.h
-r 与 -R 相同。
4. rm 删除文件目录
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ rm 1.txt 2.txt # 删除多个文件
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c 1a.txt 3.txt 4.txt d1 d2 d3 stdio.h
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ rm *.txt # 使用通配符
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c d1 d2 d3 stdio.h
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ rm d1 # 删除目录报错
rm: 无法删除'd1': 是一个目录
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ rm -r d1 # 使用 -r 选项可以删除目录,递归进入子目录进行删除,删除目录时还是调用 rmdir 命令
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c d2 d3 stdio.h
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c d2 d3 stdio.h
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ rm -i stdio.h # -i 选项在每删除一个文件时都要询问,回答 y 删除,n 不删除
rm:是否删除普通文件 'stdio.h'? n # 回答 n 表示不删除
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ rm -i stdio.h
rm:是否删除普通文件 'stdio.h'? y # 回答 y 表示删除
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c d2 d3
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ rm -rf d2 # -f 选项表示不询问,直接删除
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c d3
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$
5. mv 移动或改名文件
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ mv d3 d1 # 将目录 d3 改名为 d1,因为 d1 不存在
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c d1
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c d2
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ mv d1 d2 # d2 是已存在的,则将 d1 移动到 d2 下面
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c d2
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c 1.txt 2.txt 3.txt d2
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ mv *.txt d2 # 移动多个文件到目录
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c d2
6. sudo 以管理员身份运行
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ fdisk -l
fdisk: 打不开 /dev/loop0: 权限不够
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ sudo fdisk -l # 使用 sudo 以管理员身份运行 fdisk 命令,要求输入当前用户的密码
7. echo 显示变量的值或文本
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ echo $PATH
/opt/Qt5.12.8/5.12.8/gcc_64:/opt/Qt5.12.8/Tools/QtCreator/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/arm/gcc-linaro-arm-linux-2.6.32.2-mini2440-20110413_linux/bin
# 显示环境变量 PATH 的值,注意引用变量时要在前面使用 $ 符号,但对变量赋值时不能使用 $
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ echo PATH=$PATH
PATH=/opt/Qt5.12.8/5.12.8/gcc_64:/opt/Qt5.12.8/Tools/QtCreator/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/arm/gcc-linaro-arm-linux-2.6.32.2-mini2440-20110413_linux/bin # 显示字符串 PATH= 及变量 PATH 的值
uangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ echo enter a num;read MYNUM
enter a num # echo 命令显示提示文本,read 命令读取输入并保存到 MYNUM 自定义变量中
12
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ echo $MYNUM
12
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ echo "hello \n world" # 转义字符默认不生效
hello \nworld
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ echo -e "hello \n world" # 使用 -e 选项启用转义
hello
world
使用 unset 命令(bash 的 built-in 内置命令)可以删除变量和函数
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ read MYNUN <<<78;echo MYNUM=$MYNUM
MYNUM=12 # 将 78 输入给 MYNUM 变量
8. touch 创建一个空文件或修改文件的最后修改时间
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c d2
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ touch 1.txt 2.txt 3.txt # 创建三个空文件,它们原来不存在
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c 1.txt 2.txt 3.txt d2
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls -l
总用量 4
-rw-rw-r-- 1 huangshaofeng huangshaofeng 0 7月 15 21:04 10.c
-rw-rw-r-- 1 huangshaofeng huangshaofeng 0 7月 16 12:44 1.txt
-rw-rw-r-- 1 huangshaofeng huangshaofeng 0 7月 16 12:44 2.txt
-rw-rw-r-- 1 huangshaofeng huangshaofeng 0 7月 16 12:44 3.txt
drwxrwxr-x 3 huangshaofeng huangshaofeng 4096 7月 16 12:26
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls -l
总用量 36
-rw-rw-r-- 1 huangshaofeng huangshaofeng 0 7月 15 21:04 10.c
-rw-rw-r-- 1 huangshaofeng huangshaofeng 0 7月 16 12:44 1.txt
-rw-rw-r-- 1 huangshaofeng huangshaofeng 0 7月 16 12:44 2.txt
-rw-rw-r-- 1 huangshaofeng huangshaofeng 0 7月 16 12:44 3.txt
drwxrwxr-x 3 huangshaofeng huangshaofeng 4096 7月 16 12:26 d2
-rw-r--r-- 1 huangshaofeng huangshaofeng 29665 7月 16 12:46 stdio.h
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ touch stdio.h # 因为 stdio.h 已存在,修改它的最后修改时间为当前时间
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls -l
总用量 36
-rw-rw-r-- 1 huangshaofeng huangshaofeng 0 7月 15 21:04 10.c
-rw-rw-r-- 1 huangshaofeng huangshaofeng 0 7月 16 12:44 1.txt
-rw-rw-r-- 1 huangshaofeng huangshaofeng 0 7月 16 12:44 2.txt
-rw-rw-r-- 1 huangshaofeng huangshaofeng 0 7月 16 12:44 3.txt
drwxrwxr-x 3 huangshaofeng huangshaofeng 4096 7月 16 12:26 d2
-rw-r--r-- 1 huangshaofeng huangshaofeng 29665 7月 16 12:47 stdio.h
在编程中,由于两个系统的时间存在时间差,比如在两个时区的系统之间可能存在时间差,从东部时区打包的文件到西部时区,
就有可能存在这种情况,即西部时区解包的文件,是在未来的某个时间创建的,这显然不符合逻辑。
要想纠正这种“时间错”,可以使用 touch * 来修改所有文件的最后修改时间。
9. cat 文本文件的内容
一般用于显示行数不多的文件内容。显示完毕返回命令行,不会停留在文件中。
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ cat /etc/passwd # 显示密码文件的内容
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ cat -n /etc/passwd # -n 显示行号
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ cat -ns /etc/passwd # -s 压缩连续的多行为一行
10. less 交互显示文件内容
可以上下翻页,上下逐行滚动,查找。不想以编辑的方式查看文件内容时,可以使用 less 命令。
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ less stdio.h
上下箭头可以上下滚动一行,回车向下滚动一行,PageUp 向上翻页,PageDown 向下翻页,
/word 查找 word,并高亮显示所有的 word,输入 n 向下查找下一个 word,输出 N 向上查找
?word 查找 word,并高亮显示所有的 word,输入 N 向下查找下一个 word,输出 n 向上查找
q 退出
11. more 交互显示文件内容
回车向下翻一行,空格向下翻一页,q 退出,显示当前所处位置的百分比
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ more stdio.h
12. head 显示文件的前 n 行
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ head stdio.h # 默认显示文件的前 10 行
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ head -20 stdio.h # -20 指定显示文件的前 20 行
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ head -20 -c stdio.h # -c 20 显示前 20 个字节
13. tail 显示文件的末 n 行
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ tail stdio.h # 默认显示文件的末 10 行
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ tail -20 stdio.h # -20 指定显示文件的末 20 行
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ tail -20 -c stdio.h # -c 20 显示末 20 个字节
14. ln 链接
硬链接: 可以理解为一个文件取了多个名称。
如果删除硬链接,只有当硬链接数为 0 时才从磁盘删除这个文件。
限制:不能跨设备(文件系统)创建硬链接,不能对目录创建硬链接。
符号链接:链接文件中保存了目标文件的路径。可以通过链接文件找到目标文件。
删除链接文件,则仅将其自动删除,不会删除它所链接的目标文件。 不存在硬链接的两个限制。
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls -i # 查看文件的 inode 号
659231 10.c 660513 1.txt 660514 2.txt 660515 3.txt 659199 d2 660516 stdio.h
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ln stdio.h stdio-ln.h # 创建硬链接
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls -i # stdio.h 与 srdio-ln.h 的 inode 相同
659231 10.c 660514 2.txt 659199 d2 660516 stdio-ln.h
660513 1.txt 660515 3.txt 660516 stdio.h
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls -i stdio*
660516 stdio.h 660516 stdio-ln.h # 硬链接数为 2
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ rm stdio-ln.h # 删除其中一个硬链接,数目变为 1
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls -i stdio*
660516 stdio.h
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ln d2 d2-ln
ln: d2: 不允许将硬链接指向目录 # 不能对目录创建硬链接
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ln /dev/pts/0 pts0 # /dev 是另一个文件系统,不可以创建到当前文件系统的硬链接
ln: 无法创建硬链接'pts0' => '/dev/pts/0': 无效的跨设备链接
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ln -s stdio.h stdio-sln.h # -s 选项创建符号链接
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls -i stdio*
660516 stdio.h 660517 stdio-sln.h # stdio-sln.h 链接文件保存了目标文件的路径
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ln -s d2 d2-sln # 为目录创建符号链接
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls -ld d*
drwxrwxr-x 3 huangshaofeng huangshaofeng 4096 7月 16 12:26 d2
lrwxrwxrwx 1 huangshaofeng huangshaofeng 2 7月 16 15:31 d2-sln -> d2
15. ifconfig 网卡配置
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ifconfig # 查看活动网卡信息
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.62.128 netmask 255.255.255.0 broadcast 192.168.62.255 # IPv4 地址,子网掩码,广播地址
inet6 fe80::1fd6:af89:8339:cf53 prefixlen 64 scopeid 0x20<link> # IPv6 地址
ether 00:0c:29:6f:af:20 txqueuelen 1000 (以太网) # 网卡硬件地址
RX packets 8580 bytes 612822 (612.8 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 7878 bytes 721674 (721.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens32 是网卡名 lo 是本地环回网卡,发送到这个网卡上的信息还可以读取回来
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (本地环回)
RX packets 2596 bytes 227709 (227.7 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2596 bytes 227709 (227.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ifconfig ens32 # 查看 ens33 网卡信息
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ifconfig ens32 -a
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ifconfig ens33 down # 普通用户不能关闭网卡
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ifconfig ens33 up # 打开网卡
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ sudo ifconfig ens33 192.168.90.215 # 修改 IP 地址,这是临时修改,下次重启恢复
window 下有类型的命令:ipconfig
16. ping 测试与远程主机的网络是否连通
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ping baidu.com # 指定 IP,-c 4 测试 4 个包,不带 -c 则一直测试下去
PING baidu.com (39.156.66.10) 56(84) bytes of data.
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=1 ttl=128 time=43.6 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=2 ttl=128 time=46.2 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=3 ttl=128 time=43.1 ms
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ping baidu.com -c 4 # 指定域名
PING baidu.com (39.156.66.10) 56(84) bytes of data.
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=1 ttl=128 time=43.3 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=2 ttl=128 time=47.8 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=3 ttl=128 time=43.5 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=4 ttl=128 time=46.5 ms
17. man, info 查看帮助手册
info 比 man 更细致,但一般还是用 man 更多些。
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ man 3 printf # 查看第 3 章中的 printf() 函数
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ man 1 printf # 查看第 1 章中的 printf 命令
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ man -a printf
--Man-- 下一页: printf(3) [ 查看 (return) | 跳过 (Ctrl-D) | 退出 (Ctrl-C) ] # 退出第 1 章后,回车选择下一章,Ctrl-D 跳过下一章,Ctrl-C 结束
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ man printf # 查看第一个章节中的 printf
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ man -k printf # 查看包含 printf 的章节条目
asprintf (3) - print to allocated string
dprintf (3) - formatted output conversion
fprintf (3) - formatted output conversion
fwprintf (3) - formatted wide-character output conversion
printf (1) - format and print data
printf (3) - formatted output conversion
snprintf (3) - formatted output conversion
sprintf (3) - formatted output conversion
swprintf (3) - formatted wide-character output conversion
vasprintf (3) - print to allocated string
vdprintf (3) - formatted output conversion
vfprintf (3) - formatted output conversion
vfwprintf (3) - formatted wide-character output conversion
vprintf (3) - formatted output conversion
vsnprintf (3) - formatted output conversion
vsprintf (3) - formatted output conversion
vswprintf (3) - formatted wide-character output conversion
vwprintf (3) - formatted wide-character output conversion
wprintf (3) - formatted wide-character output conversion
man man
手册包含 9 章:
1 Executable programs or shell commands # 可执行程序或 SHELL 命令
2 System calls (functions provided by the kernel) # 系统调用,Linux 内核的 API
3 Library calls (functions within program libraries) # 库函数
4 Special files (usually found in /dev) # 特殊文件
5 File formats and conventions eg /etc/passwd # 数据库文件
6 Games # 游戏
7 Miscellaneous (including macro packages and conventions), e.g. # 杂项
man(7), groff(7)
8 System administration commands (usually only for root) # 管理员命令
9 Kernel routines [Non standard] # 内核例程
18. clear 清屏
19. apt, apt-get 下载、安装、更新、卸载包
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ apt --help
apt 1.6.17 (amd64)
用法: apt [选项] 命令
命令行软件包管理器 apt 提供软件包搜索,管理和信息查询等功能。
它提供的功能与其他 APT 工具相同(像 apt-get 和 apt-cache),
但是默认情况下被设置得更适合交互。
常用命令:
list - 根据名称列出软件包
search - 搜索软件包描述
show - 显示软件包细节
install - 安装软件包
remove - 移除软件包
autoremove - 卸载所有自动安装且不再使用的软件包
update - 更新可用软件包列表
upgrade - 通过 安装/升级 软件来更新系统
full-upgrade - 通过 卸载/安装/升级 来更新系统
edit-sources - 编辑软件源信息文件
20. vim 文本编程器
三种模式:命令模式,插入模式,末行模式,它们之间必须通过 命令模式 进行切换:
插入模式 <--> 命令模式 <--> 末行模式
打开一个文件就进入 命令模式。
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ vim # 不带文件名,匿名文件,需要在保存时提供名称
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ vim 4.txt # 带文件名,则会以此名称保存。如果文件不存在就新建,存在就打开
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ vim 4.txt 5.txt -O # -O 从左到右排列文件
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ vim 4.txt 5.txt -o # -o 从上到下排列文件
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ vim 4.txt 5.txt -p # -p 标签方式排列文件
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ vim +200 stdio.h # 打开文件并定位到 200 行
在 VIM 的末行模式下:
:split 1.txt 以从上到下方式排列文件
:vsplit 1.txt 以从左到右方式排列文件
:tabe 1.txt 以标签方式排列文件
:set cuc 设置光标所在列标记
:set cul 设置光标所在行下划线
:set cc=80 设置列标
:set co=90 设置屏幕宽度
21. chmod 修改文件权限
两种模式:
. 字符模式,[ugoa][+-=][rwx],u 所有者,g 所属组,o 其他用户,a 所有用户;+ 增加,- 去掉,= 设置
. 数字模式,用 "八进制数" 表示权限,如
rw-rw-r-- --> 二进制:110110100 --> 八进制:664
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ chmod o+x,g+w 10.c # 所属组和其他用户都增加写权限,多个模式用逗号分隔
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ chmod ugo-r 10.c
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls -l
总用量 36
--w--w---x 1 huangshaofeng huangshaofeng 0 7月 15 21:04 10.c # 所属组和其他用户都去掉写权限
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ chmod g=rw stdio.h # 所属组设置读写权限
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ chmod 644 stdio.h # 设置权限为 rw-r--r--
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ chmod 777 stdio.h # 设置权限为 rwxrwxrwx
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ sudo chmod -R 777 d2 # -R 递归设置目录级其子目录的权限
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ # 参考 stdio.h 的权限来设置 1.txt 的权限
22. chown, chgrp 更改所有组和所属组
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ sudo chown root:root 10.c # 设置为 root 用户 root 组
[sudo] huangshaofeng 的密码:
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls -l
总用量 36
--w--w---x 1 root root 0 7月 15 21:04 10.c
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ sudo chown huangshaofeng 10.c # 只改所有者而不改所属组
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ sudo chown :huangshaofeng 10.c # 只改所属组而不改所有者
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ sudo chgrp root 1.txt # 改所属组
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ sudo chown -R :root d2 # -R 递归更改
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ sudo chown --reference=1.txt 2.txt # 参考 1.txt 来更改 2.txt 的所属组
23. passwd 更改密码
超级用户可以更改所有人的密码。
普通用户只能更改自身密码,并且对密码有限制,太简单不行,太相似也不行。
24. su 更改用户 ID 或切换为超级用户
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ su root # 切换为超级用户,输入超级用户的密码
密码:
root@huangshaofeng-virtual-machine:/home/huangshaofeng/mywork/linux1# su huangshaofeng # 切换为 huangshaofeng 用户,由于是超级用户切换的,因此不用输入密码,否则需要输入密码
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$
=========================================================================
day03
1. 环境变量
三种变量:环境变量,自定义变量,系统变量
环境变量可用于 shell 及子 shell,相当于 C 语言中的全局变量
自定义变量只用于当前 shell,相当 C 语言中的自动变量
系统变量是由系统自动生成的,以 $ 打头的变量,$0 表示当前命令,$1 第一个参数,...,另外 $*, $@
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ env # 查询当前 SHELL 的环境变量
PWD=/home/huangshaofeng/mywork/linux1 # 当前工作目录
HOME=/home/huangshaofeng # 当前用户的主目录
SHELL=/bin/bash # 当前的 shell
PATH=/opt/Qt5.12.8/5.12.8/gcc_64:/opt/Qt5.12.8/Tools/QtCreator/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin # 命令的路径
脚本:命令的集合,形成的一个文件。
写一个脚本 1.sh:
echo "............................."
echo
ls -l
echo ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
echo
ifconfig ens32
echo ".............................."
echo
授权执行:
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ chmod 777 1.sh
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls -l
-rwxrwxrwx 1 huangshaofeng huangshaofeng 158 7月 16 16:21 1.sh
如何将 1.sh 变成系统命令?
方法1,复制 1.sh 到 PATH 环境变量的路径下,如 /usr/local/bin 下
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls /usr/local/bin/1.sh # 验证一下原来是否已存在同名的文件
ls: 无法访问'/usr/local/bin/1.sh': 没有那个文件或目录
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ sudo cp 1.sh /usr/local/bin/1.sh
[sudo] huangshaofeng 的密码: # 复制 1.sh 到 /usr/local/bin 下面
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls /usr/local/bin/1.sh
/usr/local/bin/1.sh # 验证复制成功
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ 1.sh # 不带路径执行命令
.............................
总用量 40
--w--w---x 1 huangshaofeng huangshaofeng 0 7月 15 21:04 10.c
-rwxrwxrwx 1 huangshaofeng huangshaofeng 158 7月 16 16:21 1.sh
-rw-rw-r-- 1 huangshaofeng huangshaofeng 0 7月 16 12:44 1.txt
-rw-rw-r-- 1 huangshaofeng huangshaofeng 0 7月 16 12:44 2.txt
-rw-rw-r-- 1 huangshaofeng huangshaofeng 0 7月 16 12:44 3.txt
drwxrwxr-x 3 huangshaofeng huangshaofeng 4096 7月 16 12:26 d2
lrwxrwxrwx 1 huangshaofeng huangshaofeng 2 7月 16 15:31 d2-sln -> d2
-rw-r--r-- 1 huangshaofeng huangshaofeng 29665 7月 16 12:47 stdio.h
lrwxrwxrwx 1 huangshaofeng huangshaofeng 7 7月 16 15:29 stdio-sln.h -> stdio.h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.62.128 netmask 255.255.255.0 broadcast 192.168.62.255
inet6 fe80::1fd6:af89:8339:cf53 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:6f:af:20 txqueuelen 1000 (以太网)
RX packets 9496 bytes 688616 (688.6 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8122 bytes 752334 (752.3 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
..............................
方法2,将命令的路径放入 PATH 环境变量中。使用 export 命令导出变量为环境变量:
此方法只在当前终端有效,其他终端无效。为了打开终端即生效,可以将这个命令保存到启动文件中。
启动文件:~/.bashrc,~/.profile。.profile 调用了 .bashrc
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ 1.sh
bash: /usr/local/bin/1.sh: 没有那个文件或目录
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ export PATH=$PATH:/home/huangshaofeng/mywork/linux1
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ 1.sh
.............................
总用量 40
--w--w---x 1 huangshaofeng huangshaofeng 0 7月 15 21:04 10.c
-rwxrwxrwx 1 huangshaofeng huangshaofeng 158 7月 16 16:29 1.sh
-rw-rw-r-- 1 huangshaofeng huangshaofeng 0 7月 16 12:44 1.txt
-rw-rw-r-- 1 huangshaofeng huangshaofeng 0 7月 16 12:44 2.txt
-rw-rw-r-- 1 huangshaofeng huangshaofeng 0 7月 16 12:44 3.txt
drwxrwxr-x 3 huangshaofeng huangshaofeng 4096 7月 16 12:26 d2
lrwxrwxrwx 1 huangshaofeng huangshaofeng 2 7月 16 15:31 d2-sln -> d2
-rw-r--r-- 1 huangshaofeng huangshaofeng 29665 7月 16 12:47 stdio.h
lrwxrwxrwx 1 huangshaofeng huangshaofeng 7 7月 16 15:29 stdio-sln.h -> stdio.h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.62.128 netmask 255.255.255.0 broadcast 192.168.62.255
inet6 fe80::1fd6:af89:8339:cf53 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:6f:af:20 txqueuelen 1000 (以太网)
RX packets 9556 bytes 693277 (693.2 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8140 bytes 754725 (754.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
..............................
2. find 以表达式在目录中查找文件
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ find . -name "1.sh" # 在当前目录下按名称查找 1.sh 文件
./1.sh
3. locate 以名称查找文件
locate 不是要磁盘中查找,它在 /var/lib/mlocate/mlocate.db 数据库中查找,此文件会在系统启动时更新一次,之后除非执行 updatedb 命令,
否则不会更新。因此有时间效性,即在这个文件更新后新增的文件找不到,删除的文件却能找到。如果要查找最新文件情况,就先执行 updatedb。
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ locate 1.sh
/etc/profile.d/vte-2.91.sh
/home/huangshaofeng/huaqing/day_13/1.sh
/snap/gnome-3-38-2004/140/etc/profile.d/vte-2.91.sh
/snap/gnome-3-38-2004/143/etc/profile.d/vte-2.91.sh
/snap/gnome-42-2204/111/etc/profile.d/vte-2.91.sh
/snap/gnome-42-2204/120/etc/profile.d/vte-2.91.sh
总体来说,以名称查找 locate 比 find 更快,因为不需要在磁盘中逐个目录查找。
4. grep 文件中搜索满足匹配条件的行
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ grep -nH "printf" /usr/include/*.h
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ find /usr/include/ -name "*.h" |xargs grep -nH "printf"
xargs 命令将 | 管道传过来的文件名作为参数传递给 grep 命令。
5. file 打印文件类型
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ file 1.sh
1.sh: ASCII text # 文本文件
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ file /dev/pts/0
/dev/pts/0: character special (136/0) # 字符设备文件
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ file d2-sln
d2-sln: symbolic link to d2 # 符号链接
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ file /lib/x86_64-linux-gnu/libc-2.27.so # 动态库文件
/lib/x86_64-linux-gnu/libc-2.27.so: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=f7307432a8b162377e77a182b6cc2e53d771ec4b, for GNU/Linux 3.2.0, stripped
6. date 显示修改日期时间
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ date # 显示日期时间
2023年 07月 16日 星期日 16:44:06 CST
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ sudo date -s "2023-07-15 12:00:00"; date # -s 设置日期时间,需要超级权限
[sudo] huangshaofeng 的密码:
2023年 07月 15日 星期六 12:00:00 CST
2023年 07月 15日 星期六 12:00:00 CST
7. gzip, gunzip 压缩/解压缩
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ gzip *.txt # 压缩多个文件,每个文件后缀自动加上 .gz,并删除原文件
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c 1.sh 1.txt.gz 2.txt.gz 3.txt.gz d2 d2-sln stdio.h.gz stdio-sln.
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ gunzip *.txt.gz # 解压
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c 1.sh 1.txt 2.txt 3.txt d2 d2-sln stdio.h.gz stdio-sln.h
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$
8. bzip2, bunzip2 压缩/解压缩
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ bzip2 1.txt # 文件后缀自动加上 .bz2,并删除原文件
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c 1.sh 1.txt.bz2 2.txt 3.txt d2 d2-sln stdio.h.gz stdio-sln.h
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ bzip2 *.txt # 压缩多个文件
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c 1.sh 1.txt.bz2 2.txt.bz2 3.txt.bz2 d2 d2-sln stdio.h.gz stdio-sln.h
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ bunzip2 *.txt.bz2 # 解压缩
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ls
10.c 1.sh 1.txt 2.txt 3.txt d2 d2-sln stdio.h.gz stdio-sln.h
9. tar 打包,压缩/解压缩
只打包,或先打包再压缩
c 打包
x 解包
j 以 bzip2 工具压缩/解压缩
z 以 gzip 工具压缩/解压缩
J 以 xz 工具压缩/解压缩
f 打包/解包为文件
v 显示打包/解包的信息
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ tar czfv stdio.tar.gz stdio*.h # gzip 压缩
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ tar cjfv stio.tar.bz2 stdio*.h # bzip2 压缩
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ tar cJfv stio.tar.xz stdio*.h # xz 压缩
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ tar xzf stdio.tar.gz -C d11 # gzip 解压
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ tar xjf stio.tar.bz2 -C d12 # bzip2 解压
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ tar xJf stio.tar.xz -C d13 # xz 解压
10. wheris 显示命令的源文件、目标文件、帮助文档
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ whereis ls
ls: /bin/ls /opt/filesystem/bin/ls /usr/share/man/man1/ls.1.gz
11. which 显示命令的路径
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ which ls
/bin/ls
12. who, whoami, w 显示系统用户
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ who
huangshaofeng :0 2023-07-15 20:33 (:0)
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ whoami # 当前用户
huangshaofeng
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ w # 查看系统中登录的用户情况
19:16:15 up 5:39, 1 user, load average: 0.05, 0.01, 0.00
USER TTY 来自 LOGIN@ IDLE JCPU PCPU WHAT
huangsha :0 :0 六20 ?xdm? 2:17 0.02s /usr/lib/gdm3/gd
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ time ls # 执行 ls 命令,统计它的进程花费的时间
10.c 1.sh 1.txt.gz 2.txt 3.txt d2 d2-sln stdio.h.gz stdio-sln.h
real 0m0.009s
user 0m0.002s
sys 0m0.000s
real 0m0.001s # 实际时间,即进程开始到结束共花费的时间
user 0m0.001s # 系统在用户空间运行花费的时间
sys 0m0.000s # 系统运行这个进程在内核空间花费的时间,即系统调用花费的时间
14. ps 进程状态
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ps
PID TTY TIME CMD
5428 pts/0 00:00:00 bash
5518 pts/0 00:00:00 bash
5911 pts/0 00:00:00 ps
USER 用户
PID 进程号
%CPU 占用 CPU 的百分比
%MEM 占用内存的百分比
TTY 终端,脱离了控制终端的用 ? 号表示
STAT 状态,状态码如下:
D uninterruptible sleep (usually IO) # 不可中断的休眠
R running or runnable (on run queue) # 运行中,或就绪队列中等待运行
S interruptible sleep (waiting for an event to complete) # 可中断的休眠(等待事件完成)
T stopped by job control signal # 被 job 控制信号暂停
t stopped by debugger during the tracing # 在跟踪调试期间被调试器暂停
W paging (not valid since the 2.6.xx kernel) # 换页中(Linux 2.6 之后不支持)
X dead (should never be seen) # 已死(应该永不可见)
Z defunct ("zombie") process, terminated but not reaped by # 僵尸进程
its parent
BSD 扩展的状态码:
< high-priority (not nice to other users) # 高优先级进程
N low-priority (nice to other users) # 低优先级进程
L has pages locked into memory (for real-time and custom IO) # 有页被锁在内存中
s is a session leader # 会话组长
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads # 多线程
do)
+ is in the foreground process group # 在前台进程组中
一般关注占用 CPU 和 内存 情况,以及当前的状态
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ ps axjf # 查看进程树
15. top 动态查看进程状态
默认每隔 3 秒刷新一次。可以使用 -d 选项更改。
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ top
top - 19:36:20 up 5:59, 1 user, load average: 0.24, 0.07, 0.02
任务: 311 total, 2 running, 240 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.3 us, 0.8 sy, 0.0 ni, 97.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2014884 total, 181292 free, 1430900 used, 402692 buff/cache
KiB Swap: 969960 total, 878824 free, 91136 used. 378732 avail Mem
占用 CPU 比例说明:
us, user : time running un-niced user processes 高优先级用户进程
sy, system : time running kernel processes 内核进程
ni, nice : time running niced user processes 低优先级用户进程
id, idle : time spent in the kernel idle handler 内核空闲进程
wa, IO-wait : time waiting for I/O completion 等待 IO 完成
hi : time spent servicing hardware interrupts 服务硬件中断
si : time spent servicing software interrupts 服务软件中断
st : time stolen from this vm by the hypervisor 系统 VM "偷走"
PageUp 向上翻页,PageDown 向下翻页。q 退出。
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ top -d 5 -u huangshaofeng
# 间隔 5 秒刷新,查看 huangshaofeng 用户的进程
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ top -d 5 -u 1000 # 间隔 5 秒刷新,查看 ID 为 1000 的用户的进程
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ top -d 5 -p 1 # 间隔 5 秒刷新,查看进程号为 1 的进程
16. kill 向进程发送信号
farsight@ubuntu:~/test$ kill -l # 显示系统支持的信号
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
32 以下的信号是不可靠信号,33 以上的信号是可靠信号
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ kill -9 -p 3720 # 向 3720 进程发送 9 号信号,-9 可以替代为 -KILL,或 -SIGKILL
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ kill -STOP -p 3724 # 向 3724 进程发送 STOP 暂停信号
huangshaofeng@huangshaofeng-virtual-machine:~/mywork/linux1$ kill -SIGCONT -p 3724 # 向 3724 进程发送 SIGCONT 恢复运行信号
获取 a.out 程序的进程号:
huangshaofeng@huangshaofeng-virtual-machine:~$ ps aux | grep "a.out"
huangsh+ 5975 51.3 0.0 4516 808 pts/0 R+ 19:44 0:01 ./a.out
huangsh+ 5978 0.0 0.0 16184 1064 pts/1 S+ 19:44 0:00 grep --color=auto a.out
17. mount, umount 挂载,卸载
huangshaofeng@huangshaofeng-virtual-machine:~$ df
文件系统 1K-块 已用 可用 已用% 挂载点
udev 982720 0 982720 0% /dev
tmpfs 201492 3248 198244 2% /run
/dev/sda1 40071552 22531340 15678500 59% /
tmpfs 1007440 0 1007440 0% /dev/shm
....
/dev/sdb 262111936 21509888 240602048 9% /media/huangshaofeng/DISK_IMG
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sdb1 778135908 1919645538 1141509631 544.3G 72 未知
/dev/sdb2 168689522 2104717761 1936028240 923.2G 65 Novell Netware 386
/dev/sdb3 1869881465 3805909656 1936028192 923.2G 79 未知
/dev/sdb4 2885681152 2885736650 55499 27.1M d 未知
分区表记录没有按磁盘顺序。
18. 解压文件系统命令
huangshaofeng@huangshaofeng-virtual-machine:~$ sudo tar xzf filesystem.tar.gz -C /opt/