Linux学习笔记
1、发展
Minix、1991年Linux -->类Unix
2、kiss原则
Keep it Simple and Stupid
GNU项目 Gnu’s not Unix
自由关乎权力,而不是价格
3、接口
GUI、CIL
X11协议
4、内核版本号
主版本号(很大变化)、次版本号(比较大变化)、小版本号(内核修复、补丁功能更新)、第四位(小bug修复)
5、重要命令
5.1、ls命令
5.2、echo命令
echo不接受管道|
传输的数据和标准输入的数据
说明:\b
表示回退一个,不是删除一个
5.3、xargs命令
#查看echo命令的帮助信息
echo --help | xargs echo
单独使用的时候可以把接受的数据一行输出
$cat num
#1 2 3 4
#5 6
#7
$xargs < num
#1 2 3 4 5 6 7
5.4、管道符和重定向符
-
管道符:
|
(管道默认是连接前一个命令的输出到下一个命令的输入) -
重定向符:
>
and>>
(而重定向通常是需要一个文件来建立两个命令的连接) -
除了需要将输出重定向到文件,也需要将信息打印在终端。那么你可以使用
tee
命令来实现
用法: echo 'hello shiyanlou' | tee hello
- 使用
exec
命令实现“永久”重定向。exec
命令的作用是使用指定的命令替换当前的 Shell,即使用一个进程替换当前进程,或者指定新的重定向:
5.5、重定向
输出重定向
(覆盖)
grep … > out >>(追加)
grep … >> out
输入重定向
<(从文件获取数据)
wc -l< file1
带&的重定向
&> stdin+stderr
&< 与<相同
&n复制n作为fd
以n作为输入fd·<&n
n>&-关闭描述符n
n<&-关闭描述符n
(Here Document)
有选择地执行命令
$?:是上一指令的返回值,成功是0,不成功是1。一般来说,UNIX(linux) 系统的进程以执行系统调用exit() 来结束的。这个回传值就是status值。回传给父进程,用来检查子进程的执行状态。一般指令程序倘若执行成功,其回传值为 0;失败为 1。
5.6、解包和解压
tar -zxvf 解包并解压缩
tar -zcvf 打包并压缩
tar -xvf 解包
tar -cvf 打包
tar -tf file.tar #查看包的内容
gzip -d 解压
gzip 压缩
5.7、ln(建立链接)
建立硬链接 ln <target> <符号链接名称>
建立软连接(符号链接) ln -s <target> <符号链接名称>
5.8、tmux的用法
# 查看有所有tmux会话
指 令:tmux ls
快捷键:Ctrl+b s
# 新建tmux窗口
指 令:tmux new -s <session-name>
# 重命名会话
指 令:tmux rename-session -t <old-name> <new-name>
快捷键:Ctrl+b $
# 分离会话
指 令:tmux detach 或者使用 exit(关闭窗口)
快捷键:Ctrl+b d
# 重新连接会话
指 令:tmux attach -t <session-name> 或者使用 tmux at -t <session-name>
#平铺当前窗格(个人很喜欢的快捷键,注意:平铺的是当前选中的窗格)
快捷键:Ctrl+b z (再次 Ctrl+b z 则恢复)
# 杀死会话
指 令:tmux kill-session -t <session-name>
# 切换会话
指 令:tmux switch -t <session-name>
# 划分上下两个窗格
指 令:tmux split
快捷键:Ctrl+b “
# 划分左右两个窗格
指 令:tmux split -h
快捷键:Ctrl+b %
# 光标切换到上方窗格
指 令:tmux select-pane -U
快捷键:Ctrl+b 方向键上
# 光标切换到下方窗格
指 令:tmux select-pane -D
快捷键:Ctrl+b 方向键下
# 光标切换到左边窗格
指 令:tmux select-pane -L
快捷键:Ctrl+b 方向键左
# 光标切换到右边窗格
指 令:tmux select-pane -R
快捷键:Ctrl+b 方向键右
1,输入命令tmux使用工具
2,上下分屏:ctrl + b 再按 "
3,左右分屏:ctrl + b 再按 %
4,切换屏幕:ctrl + b 再按o
5,关闭一个终端:ctrl + b 再按x
6,上下分屏与左右分屏切换: ctrl + b 再按空格键
5.9、cat和tac的用法
tac 是将 cat 反写过来,所以它的功能就跟 cat 相反,cat 是由第一行开始到最后一行连续显示在屏幕上,而 tac 则是由最后一行开始到第一行反向在屏幕上显示出来。
使用cat命令创建文件,例如:
cat > 文件名
这将创建一个名为"文件名"的文件。
按下Enter键进入编辑模式,在新的一行写入要添加到文件中的数据。
按下Ctrl + D组合键保存并退出编辑模式。
5.9.1、cat、more、less的区别
- cat 命令功能:man手册中描述的功能是收尾相接合并多个文件,打印到标准输出上。也可以用于显示整个文件的内容。但是没有翻页功能,所以经常和 more 命令搭配使用。
- more 命令功能:让画面在显示满一页时暂停,此时可按空格健继续显示下一个画面,或按 q 键停止显示。
- less 命令功能:less 命令的用法与 more 命令类似,也可以用来浏览超过一页的文件。所不同的是 less 命令除了可以按空格键向下显示文件外,还可以利用上下键来滚动文件。当要结束浏览时,只要在 less 命令的提示符“:”下按 q 键即可。
5.10、gcc
5.11、read命令
read -p "请输入用户名" a
echo $a
#可以
5.12、杂命令
5.12.1、whatis
作用:显示在线手册说明页
示例1:which cowsay > /dev/null && cowsay -f head-in ohch~
示例2:which cowsay>/dev/null && echo "exist" || echo "not exist"
结果说明:
(1) 上面命令中的 && 就是用来实现选择性执行的,它表示如果前面的命令执行结果(不是表示终端输出的内容,而是表示命令执行状态的结果)返回 0 则执行后面的命令,否则不继续执行。
(2) || 在这里就是与 && 相反的控制效果,当上一条命令执行结果为 ≠0($?≠0)时则执行它后面的命令
5.12.2、wc
作用: 命令用于统计并输出一个文件中行、单词和字节的数目
# 行数
wc -l /etc/passwd
# 单词数
wc -w /etc/passwd
# 字节数
wc -c /etc/passwd
# 字符数
wc -m /etc/passwd
# 最长行字节数
wc -L /etc/passwd
5.12.3、sort
作用:前面我们也是用过多次,功能很简单就是将输入按照一定方式排序,然后再输出,它支持的排序有按字典排序,数字排序,按月份排序,随机排序,反转排序,指定特定字段进行排序等等。(默认为字典排序、升序排序)
5.12.4、uniq 命令
作用:可以用于过滤或者输出重复行
5.12.5、jobs命令
作用:查看后台正在运行的任务
5.12.6、kill命令
停止任务。 kill
命令可以杀死一个任务,但要使用任务的 pid作为参数。任务的 pid 可以通过 ps
命令查看获得,然后使用如下命令
5.12.7、top命令
f
进入菜单选项,按s
确定按什么排序,x
显示当前按哪一列排序
默认是降序排序,按R
进行升序排序
5.12.8、nl命令
参数 | 描述 |
---|---|
-b | 指定显示行号的方式,有两种: |
-b a | 表示不论是否为空行,也同样列出行号(类似 cat -n) |
-b t | 如果有空行,空的那一行不要列出行号(默认值) |
-n | 列出行号表示的方法,主要有三种: |
-n ln | 行号在屏幕的最左方显示 |
-n rn | 行号在自己栏位的最右方显示,且不加 0 |
-n rz | 行号在自己栏位的最右方显示,且加 0 |
-w | 行号栏位的占用的位数 |
5.12.9、文件处理工具
5.12.9.1、cut
示例:打印 /etc/passwd
文件中以 :
为分隔符的第 1 个字段和第 6 个字段分别表示用户名和其家目录:
cut -d ':' -f 1,6 /etc/passwd
常用参数(Linux中每个汉字3个字节)
参数 | 描述 |
---|---|
-b | 以字节为单位进行分割 |
-c | 以字符为单位进行分割 |
-d | 自定义分隔符,默认为制表符 |
-f | 自定义字段 |
–complement | 抽取整个文本行,除了那些由 -c 或 -f 选项指定的文本 |
打印 /etc/passwd
文件中每一行的前 N 个字符:
# 前五个(包含第五个)
cut /etc/passwd -c -5
# 前五个之后的(包含第五个)
cut /etc/passwd -c 5-
# 第五个
cut /etc/passwd -c 5
# 2到5之间的(包含第五个)
cut /etc/passwd -c 2-5
说明:
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
5.12.9.2、sed
参数 | 说明 |
---|---|
-n | 安静模式,只打印受影响的行,默认打印输入数据的全部内容 |
-e | 用于在脚本中添加多个执行命令一次执行,在命令行中执行多个命令通常不需要加该参数 |
-f filename | 指定执行 filename 文件中的命令 |
-r | 使用扩展正则表达式,默认为标准正则表达式 |
-i | 将直接修改输入文件内容,而不是打印到标准输出设备 |
[n1][,n2]command
[n1][~step]command
# 其中一些命令可以在后面加上作用范围,形如:
$ sed -i 's/sad/happy/g' test # g表示全局范围
$ sed -i 's/sad/happy/4' test # 4表示指定行中的第四个匹配字符串
其中 n1,n2 表示输入内容的行号,它们之间为,逗号则表示从 n1 到 n2 行,如果为~波浪号则表示从 n1 开始以 step 为步进的所有行;command 为执行动作,下面为一些常用动作指令:
命令 | 说明 |
---|---|
s | 行内替换 |
c | 整行替换 |
a | 插入到指定行的后面 |
i | 插入到指定行的前面 |
p | 打印指定行,通常与-n 参数配合使用 |
d | 删除指定行 |
5.12.9.3、awk
语法:awk [-F fs] [-v var=value] [-f prog-file | ‘program text’] [file…]
(其中-F
参数用于预先指定前面提到的字段分隔符(还有其他指定字段的方式) ,-v
用于预先为awk
程序指定变量,-f
参数用于指定awk
命令要执行的程序文件,或者在不加-f
参数的情况下直接将程序语句放在这里,最后为awk
需要处理的文本输入,且可以同时输入多个文本文件。现在我们还是直接来具体体验一下吧。)
示例:将 test 的第一行的每个字段单独显示为一行
$ awk '{
> if(NR==1){
> print $1 "\n" $2 "\n" $3
> } else {
> print}
> }' test
#说明:需要注意的是`NR`与`OFS`,这两个是`awk`内建的变量,`NR`表示当前读入的记录数,你可以简单的理解为当前处理的行数,`OFS`表示输出时的字段分隔符,默认为" "空格,如上图所见,我们将字段分隔符设置为`\n`换行符,所以第一行原本以空格为字段分隔的内容就分别输出到单独一行了。然后是`$N`其中 N 为相应的字段号,这也是`awk`的内建变量,它表示引用相应的字段,因为我们这里第一行只有三个字段,所以只引用到了`$3`。除此之外另一个这里没有出现的`$0`,它表示引用当前记录(当前行)的全部内容。
awk常用的内置变量
变量名 | 说明 |
---|---|
FILENAME | 当前输入文件名,若有多个文件,则只表示第一个。如果输入是来自标准输入,则为空字符串 |
$0 | 当前记录的内容 |
$N | N 表示字段号,最大值为NF 变量的值 |
FS | 字段分隔符,由正则表达式表示,默认为" "空格 |
RS | 输入记录分隔符,默认为"\n",即一行为一个记录 |
NF | 当前记录字段数 |
NR | 已经读入的记录数 |
FNR | 当前输入文件的记录数,请注意它与 NR 的区别 |
OFS | 输出字段分隔符,默认为" "空格 |
ORS | 输出记录分隔符,默认为"\n" |
5.12.9.4、tr
作用:可以用来删除一段文本信息中的某些文字。或者将其进行转换。
命令格式:tr [option]…SET1 [SET2]
选项 | 说明 |
---|---|
-d | 删除和 set1 匹配的字符,注意不是全词匹配也不是按字符顺序匹配 |
-s | 去除 set1 指定的在输入文本中连续并重复的字符 |
5.12.9.5、col
作用:可以将Tab
换成对等数量的空格键,或反转这个操作。
格式:col [option]
选项 | 说明 |
---|---|
-x | 将Tab 转换为空格 |
-h | 将空格转换为Tab (默认选项) |
5.12.9.6、join
作用:用于将两个文件中包含相同内容的那一行合并在一起。
格式;join [option]… file1 file2
选项 | 说明 |
---|---|
-t | 指定分隔符,默认为空格 |
-i | 忽略大小写的差异 |
-1 | 指明第一个文件要用哪个字段来对比,默认对比第一个字段 |
-2 | 指明第二个文件要用哪个字段来对比,默认对比第一个字段 |
5.12.9.7、paste
作用:与join
命令类似,它是在不对比数据的情况下,简单地将多个文件合并一起,以Tab
隔开。
格式:paste [option] file…
选项 | 说明 |
---|---|
-d | 指定合并的分隔符,默认为 Tab |
-s | 不合并到一行,每个文件为一行 |
5.12.10、文件比较命令
5.12.10.1、cmp
$cmp file1 file2
发现两个文件第一个不同就停止比较
5.12.10.2、comm
作用:comm
命令将逐行比较已经排序的两个文件。显示结果包括 3 列:第 1 列为只在第一个文件中找到的行,第 2 列为只在第二个文件中找到的行,第 3 列为两个文件的共有行。注意,comm
命令和 join
、uniq
命令一样,只能用于已经排过序的数据。
格式:comm [选项] 文件 1 文件 2
常用参数:
参数 | 描述 |
---|---|
-1 | 不输出文件 1 特有的行 |
-2 | 不输出文件 2 特有的行 |
-3 | 不输出两个文件共有的行 |
5.12.10.3、diff
格式:diff [选项] 文件
参数 | 描述 |
---|---|
-c | 上下文模式,显示全部内文,并标出不同之处 |
-u | 统一模式,以合并的方式来显示文件内容的不同 |
-a | 只会逐行比较文本文件 |
-N | 在比较目录时,若文件 A 仅出现在某个目录中,预设会显示:Only in 目录。若使用 -N 参数,则 diff 会将文件 A 与一个空白的文件比较 |
-r | 递归比较目录下的文件 |
上下文模式显示的三种特殊字符:
- + 添加行,这一行将会出现在第二个文件内,而不是第一个文件内
- - 删除行,这一行将会出现在第一个文件中,而不是第二个文件内
- ! 更改行,将会显示某个文本行的两个版本,每个版本会出现在更改组的各自部分
这些特殊字符很容易混淆,实际上记住一点就行:所有操作目的是将第一个文件变成第二个文件。
统一模式显示的特殊字符:
- + 添加这一行到第一个文件中
- - 在第一个文件中删除这一行
- a - add
- c - change
- d - delete
<
第一个文件的内容>
第二个文件的内容
patch 命令被用来把更改应用到文本文件中。它接受从 diff 程序的输出,并且通常被用来把较老的文件版本转变为较新的文件版本。让我们看看一个著名的例子:Linux 内核是由一个大型的,组织松散的贡献者团队开发而成,这些贡献者会提交固定的少量更改到源码包中。这个 Linux 内核由几千万行代码组成,虽然每个贡献者每次所做的修改相当少。对于一个贡献者来说,每做一个修改就给每个开发者发送整个的内核源码树,这是没有任何意义的。这时可以提交一个 diff 文件。一个 diff 文件包含先前的内核版本与带有贡献者修改的新版本之间的差异。然后一个接受者使用 patch 程序,把这些更改应用到他自己的源码树中。使用 diff/patch 组合提供了两个重大优点:
与整个源码树的大小相比较而言,一个 diff 文件非常小。
一个 diff文件简洁地显示了所做的修改,从而允许程序补丁的审阅者能快速地评估它。
当然,diff/patch 能工作于任何文本文件,不仅仅是源码文件。它同样适用于配置文件或任意其它文本。
准备一个 diff 文件供 patch
命令使用,GNU 文档建议这样使用 diff
命令:
diff -Naur old_file new_file > diff_file
# old file 和 new file 部分不是单个文件就是包含文件的目录。这个 r 选项支持递归目录树。
5.12.10.4、patch
命令格式:patch [选项] 补丁文件
参数 | 描述 |
---|---|
-p num | 忽略几层文件夹 |
-E | 如果发现了空文件,那么就删除它 |
-R | 取消打过的补丁 |
5.12.11、其他
echo不接收标准输入
环境变量是单向传递,父进程传入子进程的时候不会回到父进程。
``的作用是将中间的内容当成命令执行返回。
5.13、正则表达式
5.13.1、选择
|
竖直分隔符表示选择,例如"boy|girl"可以匹配"boy"或者"girl"
5.13.2数量限定
+
表示前面的字符必须出现至少一次(1 次或多次),例如,“goo+gle”,可以匹配"gooogle","goooogle"等;?
表示前面的字符最多出现一次(0 次或 1 次),例如,“colou?r”,可以匹配"color"或者"colour";*
星号代表前面的字符可以不出现,也可以出现一次或者多次(0 次、或 1 次、或多次),例如,“0*42”可以匹配 42、042、0042、00042 等。
5.13.3、范围和优先级
()
圆括号可以用来定义模式字符串的范围和优先级,这可以简单的理解为是否将括号内的模式串作为一个整体。例如,“gr(a|e)y"等价于"gray|grey”,(这里体现了优先级,竖直分隔符用于选择 a 或者 e 而不是 gra 和 ey),"(grand)?father"匹配 father 和 grandfather(这里体现了范围,?
将圆括号内容作为一个整体匹配)。
优先级(从上到下从左到右,依次降低):
运算符 | 说明 |
---|---|
\ | 转义符 |
(), (?😃, (?=), [] | 括号和中括号 |
*、+、?、{n}、{n,}、{n,m} | 限定符 |
^、$、\任何元字符 | 定位点和序列 |
| | 选择 |
5.13.4、语法
字符 | 描述 |
---|---|
\ | **将下一个字符标记为一个特殊字符、或一个原义字符。**例如,“n”匹配字符“n”。“\n”匹配一个换行符。序列“\”匹配“\”而“(”则匹配“(”。 |
^ | 匹配输入字符串的开始位置。 |
$ | 匹配输入字符串的结束位置。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配 n 次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有 o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。 |
{n,m} | m 和 n 均为非负整数,其中 n<=m。**最少匹配 n 次且最多匹配 m 次。**例如,“o{1,3}”将匹配“fooooood”中的前三个 o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。 |
* | 匹配前面的子表达式零次或多次。例如,zo*能匹配“z”、“zo”以及“zoo”。*等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。 |
? | 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。 |
? | 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。 |
. | 匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“(.|\n)”的模式。 |
(pattern) | 匹配 pattern 并获取这一匹配的子字符串。该子字符串用于向后引用。要匹配圆括号字符,请使用“(”或“)”。 |
x|y | 匹配 x 或 y。例如,“z | food”能匹配“z”或“food”。“(z | f)ood”则匹配“zood”或“food”。 |
[xyz] | 字符集合(character class)。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。其中特殊字符仅有反斜线\保持特殊含义,用于转义字符。其它特殊字符如星号、加号、各种括号等均作为普通字符。脱字符^如果出现在首位则表示负值字符集合;如果出现在字符串中间就仅作为普通字符。连字符 - 如果出现在字符串中间表示字符范围描述;如果出现在首位则仅作为普通字符。 |
[^xyz] | 排除型(negate)字符集合。**匹配未列出的任意字符。**例如,“[^abc]”可以匹配“plain”中的“plin”。 |
[a-z] | 字符范围。**匹配指定范围内的任意字符。**例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。 |
[^a-z] | 排除型的字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。 |
特殊符号 | 说明 |
---|---|
[:alnum:] | 代表英文大小写字母及数字,亦即 0-9, A-Z, a-z |
[:alpha:] | 代表任何英文大小写字母,亦即 A-Z, a-z |
[:blank:] | 代表空白键与 [Tab] 按键两者 |
[:cntrl:] | 代表键盘上面的控制按键,亦即包括 CR, LF, Tab, Del… 等等 |
[:digit:] | 代表数字而已,亦即 0-9 |
[:graph:] | 除了空白字节 (空白键与 [Tab] 按键) 外的其他所有按键 |
[:lower:] | 代表小写字母,亦即 a-z |
[:print:] | 代表任何可以被列印出来的字符 |
[:punct:] | 代表标点符号 (punctuation symbol),亦即:" ’ ? ! ; : # $… |
[:upper:] | 代表大写字母,亦即 A-Z |
[:space:] | 任何会产生空白的字符,包括空白键, [Tab], CR 等等 |
[:xdigit:] | 代表 16 进位的数字类型,因此包括: 0-9, A-F, a-f 的数字与字节 |
5.14、find和grep的区别
find / -name /etc/passwd -size 1000
size的默认单位,'b’512字节
# 都是将`...`里的文件每个执行一次
find ... -exec cmd
find ... -ok cmd
5.15、grep和find的区别
- find基本上相当于 linux下的 “搜索” , 相当于windows下的搜索功能! 它是用来搜索文件的。
- grep是用来搜索文本的, 用来在standard input或文件内部的内容中, 来搜索文字 内容的!
- find 是完全匹配(通配符),而grep是包含匹配(正则表达式)
5.15.1、grep
用法:grep + 选项 + 文件
grep的常见参数
参数 | 说明 |
---|---|
-b | 将二进制文件作为文本来进行匹配 |
-c | 统计与模式匹配的数目 |
-i | 忽略大小写 |
-n | 显示匹配文本所在行的行号 |
-v | 反选,输出不匹配行的内容 |
-r | 递归匹配查找 |
-A n | n 为正整数,表示 after 的意思,除了列出匹配行之外,还列出后面的 n 行 |
-B n | n 为正整数,表示 before 的意思,除了列出匹配行之外,还列出前面的 n 行 |
--color=auto | 将输出中的匹配项设置为自动颜色显示 |
5.15.2、find
参数 | 描述 |
---|---|
find 命令将匹配的文件输出到标准输出 | |
-exec | find 命令对匹配的文件执行该参数所给出的 shell 命令 |
-name | 按照文件名查找文件 |
-type | 查找某一类型的文件 |
-prune | 使用这一选项可以使 find 命令不在当前指定的目录中查找,如果同时使用 -depth 选项,那么 -prune 将被 find 命令忽略 |
-user | 按照文件属主来查找文件 |
-group | 按照文件所属的组来查找文件 |
-mtime -n +n | 按照文件的更改时间来查找文件,-n 表示文件更改时间距现在小于 n 天,+n 表示文件更改时间距现在大于 n 天,find 命令还有 -atime 和 -ctime 选项 |
- type类型
文件类型 | 描述 |
---|---|
b | 块设备文件 |
c | 字符设备文件 |
d | 目录 |
p | 命名管道(FIFO) |
f | 普通文件 |
l | 符号链接 |
s | 套接字 |
- size选项
单位 | 描述 |
---|---|
b | 默认值,512字节的块 |
c | 字节 |
w | 两字节的字 |
k | 千字节(1024B) |
M | 兆字节(1048576B) |
G | 吉字节(1073741824B) |
- 逻辑操作符
操作符 | 描述 |
---|---|
-and或-a | 两个测试条件同时成立,结果为真 |
-or或-o | 两个测试条件至少有一个为真,结果为真 |
-not或! | 测试条件结果取反 |
( ) | 控制测试条件次序,注意,需要在左右括号前加反斜线\ |
执行多个需要写+;
find ./ -name "*.bak" -size +10 -atime -1 -exec tar -cvf bak.tar {}+
find ./ -name "*.bak" -size +10 -atime -1 -exec tar -cvf bak.tar {} \;
6、管理用户及权限
6.1、查看用户
请打开终端,输入命令:
$ who am i
# 或者
$ who mom likes
who
命令其它常用参数
参数 | 说明 |
---|---|
-a | 打印能打印的全部 |
-d | 打印死掉的进程 |
-m | 同am i ,mom likes |
-q | 打印当前登录用户数及用户名 |
-u | 打印当前登录用户登录信息 |
-r | 打印运行等级 |
【试一试】 现在我们新建一个叫 lilei
的用户:
$ sudo adduser lilei
# 切换用户
$ su -l lilei
6.2、用户组
1、查看
方法一:使用 groups 命令
$ groups shiyanlou
方法二:查看 /etc/group
文件
$ cat /etc/group | sort
2、修改组权限
当然也可以通过 sudo passwd shiyanlou
进行设置,或者你直接关闭当前终端打开一个新的终端。
$ groups lilei
$ sudo usermod -G sudo lilei
$ groups lilei
3、删除用户是很简单的事:
userdel:
userdel 是一个较底层的命令,通常用于删除用户账户。它的主要功能是从系统文件(如 /etc/passwd、/etc/shadow 等)中删除用户信息。使用 userdel 命令时,你需要手动提供额外的选项来指定是否同时删除用户的主目录、用户的邮件箱以及其他用户相关的文件。例如:
1 userdel username # 仅删除用户账户
2 userdel -r username # 删除用户账户及其主目录
deluser:
deluser 是一个更高级的用户管理工具,它实际上是对 userdel 命令的一个封装,旨在提供更友好和更安全的用户删除体验。deluser 命令会自动处理用户的主目录、用户组、邮件箱等相关文件的删除。使用 deluser 命令时,不需要手动指定选项来删除用户的主目录等内容,这会减少出错的可能性。例如:
deluser username # 删除用户账户及其主目录等相关文件
$ sudo deluser lilei --remove-home
6.3、文件权限
6.3.1、权限
读权限,表示你可以使用 cat <file name>
之类的命令来读取某个文件的内容;写权限,表示你可以编辑和修改某个文件的内容; 执行权限,通常指可以运行的二进制程序文件或者脚本文件,如同 Windows 上的 exe
后缀的文件,不过 Linux 上不是通过文件后缀名来区分文件的类型。你需要注意的一点是,一个目录同时具有读权限和执行权限才可以打开并查看内部文件,而一个目录要有写权限才允许在其中创建其它文件,这是因为目录文件实际保存着该目录里面的文件的列表等信息。
所有者权限,这一点相信你应该明白了,至于所属用户组权限,是指你所在的用户组中的所有其它用户对于该文件的权限,比如,你有一个 iPad,那么这个用户组权限就决定了你的兄弟姐妹有没有权限使用它破坏它和占有它。
- 链接数
链接到该文件所在的 inode 结点的文件名数目(关于这个概念涉及到 Linux 文件系统的相关概念知识,感兴趣的用户可以查看 硬链接和软链接的联系与区别)。
- 文件大小
以 inode 结点大小为单位来表示的文件大小,你可以给 ls 加上
-lh
参数来更直观的查看文件的大小。
6.3.2、变更文件所有者
切换到 lilei
用户,然后在 /home/lilei
目录新建一个文件,命名为 iphone11
。
$ su - lilei
$ pwd
$ touch iphone11
$ ls -alh iphone11
可见文件所有者是 lilei
现在切换回到 shiyanlou 用户,使用以下命令变更文件所有者为 shiyanlou
。
# 需要切换到 shiyanlou 用户执行以下操作
$ cd /home/lilei
$ ls iphone11
$ sudo chown shiyanlou iphone11
现在查看,发现文件所有者成功修改为 shiyanlou。
6.3.3、修改文件权限
- 方式一:二进制数字表示
每个文件有三组固定的权限,分别对应拥有者,所属用户组,其他用户,记住这个顺序是固定的。文件的读写执行对应字母 rwx
,以二进制表示就是 111
,用十进制表示就是 7
,对进制转换不熟悉的同学可以看看 进制转换。例如我们刚刚新建的文件 iphone11 的权限是 rw-rw-rw-
,换成对应的十进制表示就是 666,这就表示这个文件的拥有者,所属用户组和其他用户具有读写权限,不具有执行权限。
如果要将文件 iphone11
的权限改为只有我自己可以用,那么就可以用这个方法更改它的权限。
为了演示,我先在文件里加点内容:
$ echo "echo \"hello shiyanlou\"" > iphone11
然后修改权限:
$ chmod 600 iphone11
$ ls -alh iphone11
- 方式二:加减赋值操作
要完成上述实验相同的效果,你可以:
$ chmod go-rw iphone11
g
、o
还有 u
分别表示 group(用户组)、others(其他用户) 和 user(用户),+
和 -
分别表示增加和去掉相应的权限。
adduser 和 useradd 的区别是什么
答:
useradd
只创建用户,不会创建用户密码和工作目录,创建完了需要使用passwd <username>
去设置新用户的密码。adduser
在创建用户的同时,会创建工作目录和密码(提示你设置),做这一系列的操作。其实useradd
、userdel
这类操作更像是一种命令,执行完了就返回。而adduser
更像是一种程序,需要你输入、确定等一系列操作。