SRE 第二次作业

通配符、管道、重定向

通配符

文件通配符可以用来匹配符合条件的多个文件名称,方便批量管理文件,通配符采用特定的符号,表示特定的含义,此特定符号称为元meta字符

常见的通配符

元字符 含义
~ 当前用户家目录路径
~用户名 指定用户家目录路径
- 上一个工作目录路径
. 当前工作目录路径
* 匹配零个或多个任意字符,但不匹配”.”开头的文件(即隐藏文件)
? 匹配单个任意字符(汉字算一个字符)
[0-9] 匹配0到9的单个字符
[a-z] 匹配a到z的单个字符,注意,在低版本的bash中,字母排列顺序为aAbBcC .... zZ
[0-9a-z] 匹配0到9或a到z的单个字符
[wang] 匹配w、a、n、g其中单个字符
[^wang] 匹配除w、a、n、g以外的单个字符

通配符案例

创建测试文件

lxh@LXH-Ubuntu:~/test_tonpe$ touch file1.txt file2.txt file3.txt filea.txt fileb.txt filec.txt \
test1.log test2.log test-backup-2023.txt test-backup-2024.txt \
photo.jpg photo.png document.pdf script.sh data123.csv data456.csv \
file-with-dash.txt file_with_underscore.conf
lxh@LXH-Ubuntu:~/test_tonpe$ 
lxh@LXH-Ubuntu:~/test_tonpe$ ls
data123.csv  document.pdf  file2.txt  filea.txt  filec.txt           file_with_underscore.conf  photo.png  test1.log  test-backup-2023.txt
data456.csv  file1.txt     file3.txt  fileb.txt  file-with-dash.txt  photo.jpg                  script.sh  test2.log  test-backup-2024.txt

1.匹配所有以.txt结尾的文件

lxh@LXH-Ubuntu:~/test_tonpe$ ls *.txt
file1.txt  file2.txt  file3.txt  filea.txt  fileb.txt  filec.txt  file-with-dash.txt  test-backup-2023.txt  test-backup-2024.txt

2.匹配所有以test开头的文件

lxh@LXH-Ubuntu:~/test_tonpe$ ls test*
test1.log  test2.log  test-backup-2023.txt  test-backup-2024.txt

3.匹配所有包含backup的文件

lxh@LXH-Ubuntu:~/test_tonpe$ ls *backup*
test-backup-2023.txt  test-backup-2024.txt

4.所有文件

lxh@LXH-Ubuntu:~/test_tonpe$ ls *
data123.csv  document.pdf  file2.txt  filea.txt  filec.txt           file_with_underscore.conf  photo.png  test1.log  test-backup-2023.txt
data456.csv  file1.txt     file3.txt  fileb.txt  file-with-dash.txt  photo.jpg                  script.sh  test2.log  test-backup-2024.txt

5.匹配photo.jpg, photo.png(前面均为photo.,后面扩展名恰好3个字符)

lxh@LXH-Ubuntu:~/test_tonpe$ ls photo.???
photo.jpg  photo.png

6.匹配以fp开头且以.txt结尾的文件

lxh@LXH-Ubuntu:~/test_tonpe$ ls [fp]*.txt
file1.txt  file2.txt  file3.txt  filea.txt  fileb.txt  filec.txt  file-with-dash.txt

7.匹配包含连续三个数字的文件

lxh@LXH-Ubuntu:~/test_tonpe$ ls *[0-9][0-9][0-9]*
data123.csv  data456.csv  test-backup-2023.txt  test-backup-2024.txt

8.匹配不以数字结尾的.txt文件

lxh@LXH-Ubuntu:~/test_tonpe$ ls *[^0-9].txt
filea.txt  fileb.txt  filec.txt  file-with-dash.txt

管道符

使用管道,要求前一个命令必须支持标准输出,后一个命令必须支持标准输入

标准错误默认不能通过管道转发(管道默认只传递标准输出),可利用 2>&1 | 或 |&实现

管道符案例

获取/var/log目录下面的最大的5个日志文件,输出文件名称

lxh@LXH-Ubuntu:~$ ls -l /var/log | grep "^-" | tr -s " " | sort -t " " -k 5 -nr | head -n 5 | awk '{print $NF}'
syslog.1
kern.log.1
syslog
dpkg.log.1
kern.log
lxh@LXH-Ubuntu:~$ 

案例解析

1.首先以长格式输出 /var/log 目录下的文件和目录

lxh@LXH-Ubuntu:~$ ls -l /var/log
total 8164
-rw-r--r--  1 root      root              11341 Nov  3 00:41 alternatives.log
-rw-r--r--  1 root      root              28241 Oct 29 18:02 alternatives.log.1
-rw-r-----  1 root      adm                   0 Sep 12 00:10 apport.log
drwxr-xr-x  2 root      root               4096 Nov  8 11:27 apt
-rw-r-----  1 syslog    adm               30773 Nov 10 03:35 auth.log
-rw-r-----  1 syslog    adm              154090 Nov  8 23:59 auth.log.1
-rw-r-----  1 syslog    adm                7179 Nov  1 23:59 auth.log.2.gz
-rw-r--r--  1 root      root              61229 Aug  5 16:54 bootstrap.log
-rw-rw----  1 root      utmp               4992 Nov  8 12:52 btmp
-rw-rw----  1 root      utmp                384 Oct 30 00:19 btmp.1
-rw-r-----  1 syslog    adm               72029 Sep 12 00:10 cloud-init.log
-rw-r-----  1 root      adm                4283 Sep 12 00:10 cloud-init-output.log
-rw-r-----  1 root      adm              135902 Nov 10 03:06 dmesg

2.然后通过grep命令筛选出普通文件

lxh@LXH-Ubuntu:~$ ls -l /var/log | grep "^-"
-rw-r--r--  1 root      root              11341 Nov  3 00:41 alternatives.log
-rw-r--r--  1 root      root              28241 Oct 29 18:02 alternatives.log.1
-rw-r-----  1 root      adm                   0 Sep 12 00:10 apport.log
-rw-r-----  1 syslog    adm               30773 Nov 10 03:35 auth.log
-rw-r-----  1 syslog    adm              154090 Nov  8 23:59 auth.log.1
-rw-r-----  1 syslog    adm                7179 Nov  1 23:59 auth.log.2.gz
-rw-r--r--  1 root      root              61229 Aug  5 16:54 bootstrap.log
-rw-rw----  1 root      utmp               4992 Nov  8 12:52 btmp
-rw-rw----  1 root      utmp                384 Oct 30 00:19 btmp.1
-rw-r-----  1 syslog    adm               72029 Sep 12 00:10 cloud-init.log
-rw-r-----  1 root      adm                4283 Sep 12 00:10 cloud-init-output.log

3.接着使用tr对连续空格进行压缩

lxh@LXH-Ubuntu:~$ ls -l /var/log | grep "^-" | tr -s " "
-rw-r--r-- 1 root root 11341 Nov 3 00:41 alternatives.log
-rw-r--r-- 1 root root 28241 Oct 29 18:02 alternatives.log.1
-rw-r----- 1 root adm 0 Sep 12 00:10 apport.log
-rw-r----- 1 syslog adm 32933 Nov 10 04:55 auth.log
-rw-r----- 1 syslog adm 154090 Nov 8 23:59 auth.log.1
-rw-r----- 1 syslog adm 7179 Nov 1 23:59 auth.log.2.gz
-rw-r--r-- 1 root root 61229 Aug 5 16:54 bootstrap.log
-rw-rw---- 1 root utmp 4992 Nov 8 12:52 btmp
-rw-rw---- 1 root utmp 384 Oct 30 00:19 btmp.1
-rw-r----- 1 syslog adm 72029 Sep 12 00:10 cloud-init.log
-rw-r----- 1 root adm 4283 Sep 12 00:10 cloud-init-output.log
-rw-r----- 1 root adm 135902 Nov 10 03:06 dmesg
-rw-r----- 1 root adm 133937 Nov 9 22:43 dmesg.0
-rw-r----- 1 root adm 27515 Nov 9 11:16 dmesg.1.gz
-rw-r----- 1 root adm 26973 Nov 8 12:51 dmesg.2.gz
-rw-r----- 1 root adm 163 Nov 8 11:31 dmesg.3.gz
-rw-r----- 1 root adm 28071 Nov 8 10:13 dmesg.4.gz

4.使用sort,分隔符为空格,针对第五列内容进行数字的倒序排序(从大到小)

lxh@LXH-Ubuntu:~$ ls -l /var/log | grep "^-" | tr -s " " | sort -t " " -k 5 -nr
-rw-r----- 1 syslog adm 2808675 Nov 9 00:00 syslog.1
-rw-r----- 1 syslog adm 1881349 Nov 8 23:29 kern.log.1
-rw-r----- 1 syslog adm 801894 Nov 10 04:57 syslog
-rw-r--r-- 1 root root 736568 Oct 29 23:42 dpkg.log.1
-rw-r----- 1 syslog adm 559094 Nov 10 04:57 kern.log
-rw-r--r-- 1 root root 329801 Nov 8 11:27 dpkg.log
-rw-rw-r-- 1 root utmp 292292 Nov 10 03:11 lastlog
-rw-r----- 1 syslog adm 166317 Nov 2 00:00 syslog.2.gz
-rw-r----- 1 syslog adm 154090 Nov 8 23:59 auth.log.1
-rw-r----- 1 root adm 135902 Nov 10 03:06 dmesg
-rw-r----- 1 root adm 133937 Nov 9 22:43 dmesg.0
-rw-r----- 1 syslog adm 98243 Nov 1 22:02 kern.log.2.gz
-rw-r----- 1 syslog adm 72029 Sep 12 00:10 cloud-init.log
-rw-r--r-- 1 root root 61229 Aug 5 16:54 bootstrap.log
-rw-rw-r-- 1 root utmp 57984 Nov 10 03:11 wtmp

5.使用head获取前5行

lxh@LXH-Ubuntu:~$ ls -l /var/log | grep "^-" | tr -s " " | sort -t " " -k 5 -nr | head -n 5 
-rw-r----- 1 syslog adm 2808675 Nov 9 00:00 syslog.1
-rw-r----- 1 syslog adm 1881349 Nov 8 23:29 kern.log.1
-rw-r----- 1 syslog adm 802251 Nov 10 05:00 syslog
-rw-r--r-- 1 root root 736568 Oct 29 23:42 dpkg.log.1
-rw-r----- 1 syslog adm 559094 Nov 10 04:57 kern.log
lxh@LXH-Ubuntu:~$ 

6.最终使用awk提取最后一列的文件名

lxh@LXH-Ubuntu:~$ ls -l /var/log | grep "^-" | tr -s " " | sort -t " " -k 5 -nr | head -n 5 | awk '{print $NF}'
syslog.1
kern.log.1
syslog
dpkg.log.1
kern.log
lxh@LXH-Ubuntu:~$ 

重定向

默认情况下,Linux的基本IO设备标准输入、标准输出、标准错误,都是指向当前正在使用的终端

lxh@LXH-Ubuntu:~$ ll /dev/std*
lrwxrwxrwx 1 root root 15 Nov 10 03:06 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Nov 10 03:06 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Nov 10 03:06 /dev/stdout -> /proc/self/fd/1
lxh@LXH-Ubuntu:~$ 
lxh@LXH-Ubuntu:~$ ll /proc/self/fd
total 0
dr-x------ 2 lxh lxh  4 Nov 10 05:12 ./
dr-xr-xr-x 9 lxh lxh  0 Nov 10 05:12 ../
lrwx------ 1 lxh lxh 64 Nov 10 05:12 0 -> /dev/pts/0
lrwx------ 1 lxh lxh 64 Nov 10 05:12 1 -> /dev/pts/0
lrwx------ 1 lxh lxh 64 Nov 10 05:12 2 -> /dev/pts/0
lr-x------ 1 lxh lxh 64 Nov 10 05:12 3 -> /proc/1614/fd/
lxh@LXH-Ubuntu:~$ 
lxh@LXH-Ubuntu:~$ tty
/dev/pts/0
lxh@LXH-Ubuntu:~$ 

可以通过重定向实现,将默认的输入,输出或错误对应的设备改变,指向新的目标

比如可以将命令输出重定向到另一个终端

image-20251110131845566

重定向案例

输出重定向

将标准输出重定向到指定文件

lxh@LXH-Ubuntu:/$ ll > /home/lxh/output			# 直接覆盖文件中的内容,若指定文件不存在,则自动创建
lxh@LXH-Ubuntu:/$ cat /home/lxh/output
total 2097248
drwxr-xr-x  24 root root       4096 Nov  3 00:29 ./
drwxr-xr-x  24 root root       4096 Nov  3 00:29 ../
lrwxrwxrwx   1 root root          7 Apr 22  2024 bin -> usr/bin/
drwxr-xr-x   2 root root       4096 Feb 26  2024 bin.usr-is-merged/
drwxr-xr-x   4 root root       4096 Nov  8 04:27 boot/
dr-xr-xr-x   2 root root       4096 Aug  5 23:53 cdrom/
drwxr-xr-x   4 root root       4096 Nov  3 00:42 data/
drwxr-xr-x  20 root root       4120 Nov 10 03:06 dev/
drwxr-xr-x 116 root root       4096 Nov  8 11:27 etc/
drwxr-xr-x   4 root root       4096 Nov  3 13:30 home/
lrwxrwxrwx   1 root root          7 Apr 22  2024 lib -> usr/lib/
lrwxrwxrwx   1 root root          9 Apr 22  2024 lib64 -> usr/lib64/
drwxr-xr-x   2 root root       4096 Feb 26  2024 lib.usr-is-merged/
drwx------   2 root root      16384 Sep 11 23:55 lost+found/
drwxr-xr-x   2 root root       4096 Aug  5 16:54 media/
drwxr-xr-x   2 root root       4096 Aug  5 16:54 mnt/
drwxr-xr-x   2 root root       4096 Aug  5 16:54 opt/
dr-xr-xr-x 281 root root          0 Nov 10 03:06 proc/
drwx------   5 root root       4096 Nov  9 04:14 root/
drwxr-xr-x  30 root root        860 Nov 10 03:12 run/
lrwxrwxrwx   1 root root          8 Apr 22  2024 sbin -> usr/sbin/
drwxr-xr-x   2 root root       4096 Dec 11  2024 sbin.usr-is-merged/
drwxr-xr-x   2 root root       4096 Sep 12 00:10 snap/
drwxr-xr-x   2 root root       4096 Aug  5 16:54 srv/
-rw-------   1 root root 2147483648 Sep 12 00:00 swap.img
dr-xr-xr-x  13 root root          0 Nov 10 03:06 sys/
drwxrwxrwt  14 root root       4096 Nov 10 05:37 tmp/
drwxr-xr-x  12 root root       4096 Aug  5 16:54 usr/
drwxr-xr-x  13 root root       4096 Nov  3 00:11 var/
lxh@LXH-Ubuntu:/$ 
lxh@LXH-Ubuntu:/$ cat /home/lxh/output 
Hello_world
lxh@LXH-Ubuntu:/$ ls >> /home/lxh/output		# 将输出结果追加到指定文件中
lxh@LXH-Ubuntu:/$ cat /home/lxh/output 
Hello_world
bin
bin.usr-is-merged
boot
cdrom
data
dev
etc
...
lxh@LXH-Ubuntu:/$ 

错误重定向

将标准错误重定向到指定文件

lxh@LXH-Ubuntu:/$ cat abc
cat: abc: No such file or directory
lxh@LXH-Ubuntu:/$ 
lxh@LXH-Ubuntu:/$ cat abc 2> /dev/null				# 将错误输出丢到垃圾桶中
lxh@LXH-Ubuntu:/$ 
lxh@LXH-Ubuntu:/$ abc
Command 'abc' not found, but there are 16 similar ones.
lxh@LXH-Ubuntu:/$ 
lxh@LXH-Ubuntu:/$ abc 2>> /home/lxh/error.log		# 将错误输出追加到错误日志文件中
lxh@LXH-Ubuntu:/$ cat /home/lxh/error.log
Command 'abc' not found, but there are 16 similar ones.
lxh@LXH-Ubuntu:/$ 

输入重定向

对标准输入进行重定向

lxh@LXH-Ubuntu:/$ cat /home/lxh/test.txt 
1
3
2
7
10
100
2
4
lxh@LXH-Ubuntu:/$ sort -rn < /home/lxh/test.txt 		# 对文件内容进行数字排序
100
10
7
4
3
2
2
1
lxh@LXH-Ubuntu:/$ 
lxh@LXH-Ubuntu:/$ cat > /home/lxh/test.txt <<EOF		# 先进行输入重定向,输入多行数据,然后输出到文件中
> 123
> 456
> 789
> EOF
lxh@LXH-Ubuntu:/$ 
lxh@LXH-Ubuntu:/$ cat /home/lxh/test.txt
123
456
789
lxh@LXH-Ubuntu:/$ cat <<< `ls`			# 将一个命令的输出重定向到另一个命令的输入
bin
bin.usr-is-merged
boot
cdrom
data
dev
etc
...
lxh@LXH-Ubuntu:/$
lxh@LXH-Ubuntu:/$ cat < <(ls)			# 相同的效果
bin
bin.usr-is-merged
boot
cdrom
data
dev
etc
...
lxh@LXH-Ubuntu:/$ 

用户与用户组

用户

Linux中的用户分类

  • 超级管理员root:对系统具有近乎完全的控制权限,UID固定为0
  • 普通用户
    • 系统用户:专用于跑一些程序软件,不可登录,UID位于(0, 999]
    • 登录用户:用于用于登录系统交互使用,UID位于[1000, 无限]

安全上下文

一个用户是否可以运行某个程序,取决于该用户是否对该程序具有权限

root@LXH-Ubuntu:/tmp# cat test.sh
echo running
root@LXH-Ubuntu:/tmp# ll test.sh					# 此程序对其他用户没有x权限
-rwxr--r-- 1 root root 13 Nov 10 14:05 test.sh*
root@LXH-Ubuntu:/tmp# ./test.sh						# root可以执行该程序,因为它具有权限
running
root@LXH-Ubuntu:/tmp# su lxh
lxh@LXH-Ubuntu:/tmp$ ./test.sh						# lxh无法执行该程序,因为它不具有相应权限
bash: ./test.sh: Permission denied
lxh@LXH-Ubuntu:/tmp$ 

一个程序运行以后,其权限取决于运行者的权限

lxh@LXH-Ubuntu:/$ cat /etc/shadow			# lxh运行cat程序,无法查看/etc/shadow
cat: /etc/shadow: Permission denied
lxh@LXH-Ubuntu:/$ 
lxh@LXH-Ubuntu:/$ su root
Password: 
root@LXH-Ubuntu:/# cat /etc/shadow			# root同样运行cat程序,但是可以查看/etc/shadow
root:$y$j9T$C7yNvMUkbXKaKmuqIOm2W.$0BgFKU83UGa6jbJT.1DCanf35yR1oa3IsYQxC3JcMu9:20394:0:99999:7:::
daemon:*:20305:0:99999:7:::
bin:*:20305:0:99999:7:::
sys:*:20305:0:99999:7:::
sync:*:20305:0:99999:7:::
games:*:20305:0:99999:7:::
man:*:20305:0:99999:7:::
lp:*:20305:0:99999:7:::
mail:*:20305:0:99999:7:::
...

用户相关的配置文件

passwd

root@LXH-Ubuntu:/# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
...

7个字段(以root为例):

  1. 用户名:root
  2. 密码(使用x占位):x
  3. UID:0
  4. GID:0
  5. 描述信息:root
  6. 家目录:/root
  7. 所使用shell:/bin/bash

shadow

root@LXH-Ubuntu:/# cat /etc/shadow
root:$y$j9T$C7yNvMUkbXKaKmuqIOm2W.$0BgFKU83UGa6jbJT.1DCanf35yR1oa3IsYQxC3JcMu9:20394:0:99999:7:::
daemon:*:20305:0:99999:7:::
bin:*:20305:0:99999:7:::
sys:*:20305:0:99999:7:::
sync:*:20305:0:99999:7:::
games:*:20305:0:99999:7:::
man:*:20305:0:99999:7:::
lp:*:20305:0:99999:7:::
mail:*:20305:0:99999:7:::
news:*:20305:0:99999:7:::
...

9个字段(以root为例):

  1. 用户名:root
  2. 密码(加salt后的密文):$y$j9T$C7yNvMUkbXKaKmuqIOm2W.$0BgFKU83UGa6jbJT.1DCanf35yR1oa3IsYQxC3JcMu9
  3. 上次修改时间:20394
  4. 最短密码修改间隔:0,表示随时可以修改
  5. 最长密码修改间隔:99999,表示可以永远不更换密码
  6. 告警时间:7,表示提前7天告警要更换密码
  7. 不活动时间:空,表示永不过期
  8. 失效时间:空,表示永不失效
  9. 无意义

用户相关命令

id

用途:查看UID、GID,主要组,附加组

案例:

[root@Rocky ~]# gpasswd -a lxh group1
Adding user lxh to group group1
[root@Rocky ~]# 
[root@Rocky ~]# id lxh
uid=1000(lxh) gid=1000(lxh) groups=1000(lxh),1001(group1)

su

用途:切换用户

案例:

[lxh@Rocky ~]$ pwd
/home/lxh
[lxh@Rocky ~]$ su -		# 登录式切换,会改变当前目录,并执行配置文件
Password: 
[root@Rocky ~]# pwd
/root
[root@Rocky ~]# 
[root@Rocky ~]# su lxh	# 非登录式切换,不会切换工作目录,执行部分配置文件
[lxh@Rocky root]$ pwd
/root
[lxh@Rocky root]$ 

useradd

用途:添加用户

案例:

[root@Rocky ~]# useradd tom -m -u 800 		# 创建用户tom,确保自动创建家目录,指定UID为800
[root@Rocky ~]# 
[root@Rocky ~]# grep tom /etc/passwd
tom:x:800:1001::/home/tom:/bin/bash
[root@Rocky ~]# ls /home/
lxh  tom
[root@Rocky ~]# 

usermod

用途:修改用户相关信息

案例:

[root@Rocky ~]# usermod tom -u 199			# 修改用户tom的UID为199
[root@Rocky ~]# 
[root@Rocky ~]# grep tom /etc/passwd
tom:x:199:1001::/home/tom:/bin/bash
[root@Rocky ~]# 

userdel

用途:删除用户

案例

[root@Rocky ~]# userdel tom -r				# 删除用户tom,并且自动删除家目录和邮件目录
[root@Rocky ~]# ls /home
lxh
[root@Rocky ~]# grep tom /etc/passwd
[root@Rocky ~]# 

chpasswd

用途:通过标准输入设置用户密码

案例:

[root@Rocky ~]# echo 'tom:abcde' | chpasswd				# 设置tom的密码为abcde
[root@Rocky ~]# su lxh
[lxh@Rocky root]$ su tom
Password: 				# 输入abcde
[tom@Rocky root]$ 

passwd

用途:设置用户密码

案例:

[root@Rocky ~]# echo abcdef | passwd --stdin tom		# 选项--stdin仅仅Redhat系统存在
Changing password for user tom.
passwd: all authentication tokens updated successfully.
[root@Rocky ~]# 
[root@Rocky ~]# su lxh
[lxh@Rocky root]$ su tom
Password: 
[tom@Rocky root]$

用户组

Linux中的用户组分类

  • 超级管理员组root:超级管理员root的主组,GID固定为0
  • 普通用户组
    • 系统用户组:系统用户的主组,GID位于(0, 999]
    • 登录用户组:登录用户的主组,GID位于[1000, 无限]

用户组相关的配置文件

group

root@LXH-Ubuntu:/# cat /etc/group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:syslog,lxh
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
...

4个字段(以root为例):

  1. 组名:root
  2. 组密码(使用x占位):x
  3. GID:0
  4. 用户列表:列出的用户把该组作为附加组

gshadow

root@LXH-Ubuntu:/# cat /etc/gshadow
root:*::
daemon:*::
bin:*::
sys:*::
adm:*::syslog,lxh
tty:*::
disk:*::
lp:*::
mail:*::
...

4个字段(以root为例):

  1. 组名:root
  2. 组密码:*,表示没有组密码
  3. 组管理员,空,表示没有
  4. 用户列表:列出的用户把该组作为附加组

用户组相关命令

groupadd

用途:添加用户组

案例:

[root@Rocky ~]# groupadd group1 -g 288		# 添加用户组,指定GID为288
[root@Rocky ~]# 
[root@Rocky ~]# grep group /etc/group
group1:x:288:
[root@Rocky ~]# 

groupdel

用途:删除用户组

案例:

[root@Rocky ~]# groupdel group1				# 删除用户组
[root@Rocky ~]# 
[root@Rocky ~]# grep group /etc/group
[root@Rocky ~]# 

gpasswd

用途:为指定组添加删除用户

案例:

[root@Rocky ~]# gpasswd -a lxh group1		# 向组group1中添加用户lxh
Adding user lxh to group group1
[root@Rocky ~]# 
[root@Rocky ~]# id lxh
uid=1000(lxh) gid=1000(lxh) groups=1000(lxh),1002(group1)
[root@Rocky ~]# 
[root@Rocky ~]# gpasswd -d lxh group1
Removing user lxh from group group1			# 将用户lxh从组group1中删去
[root@Rocky ~]# 
[root@Rocky ~]# id lxh
uid=1000(lxh) gid=1000(lxh) groups=1000(lxh)
[root@Rocky ~]# 

文件权限管理

权限位

通过ls -l即可看到文件的权限位

[root@Rocky ~]# ls -ld test.txt testdir
drwxr-xr-x. 2 root root 6 Nov 10 23:54 testdir
-rw-r-xr--. 1 root root 0 Nov 10 23:52 test.txt

一个文件的权限位可以划分为所有者,所属组,其他人,这三块权限

  • 所有者:文件的所有者
  • 所属组,文件所有者所处的主组
  • 其他人:既不是文件的所有者,也不在文件所有者所处的主组中的其他用户

所有者 / 所属组 / 其他人针对文件的权限

r —> 4 w —> 2 x —> 1
目录 查看目录中存放内容的权限 对目录中内容进行删除添加的权限 进入目录的权限(基本权限)
文件 查看文件内容的权限 对文件内容进行修改的权限 执行文件

umask

通过修改用户的umask可以修改该用户创建文件或目录的默认权限

默认文件的权限为666对应位减去umask,默认目录的权限为777对应位减去umask

[root@Rocky tmp]# umask
0022
[root@Rocky tmp]# mkdir testdir_root
[root@Rocky tmp]# touch testfile_root
[root@Rocky tmp]# 
[root@Rocky tmp]# ls -ld testdir_root testfile_root
drwxr-xr-x. 2 root root 6 Nov 11 00:06 testdir_root			# 777-022=755,转换为rwx r-x r-x
-rw-r--r--. 1 root root 0 Nov 11 00:06 testfile_root		# 666-022=644,转换为rw- r-- r--
[root@Rocky tmp]# 
[root@Rocky tmp]# su lxh
[lxh@Rocky tmp]$ 
[lxh@Rocky tmp]$ umask
0002
[lxh@Rocky tmp]$ mkdir testdir_lxh
[lxh@Rocky tmp]$ touch testfile_lxh
[lxh@Rocky tmp]$ 
[lxh@Rocky tmp]$ ls -ld testdir_lxh testfile_lxh
drwxrwxr-x. 2 lxh lxh 6 Nov 11 00:09 testdir_lxh			# 777-002=775,转换为rwx rwx r-x
-rw-rw-r--. 1 lxh lxh 0 Nov 11 00:09 testfile_lxh			# 666-002=664,转换为rw- rw- r--
[lxh@Rocky tmp]$ 

权限相关命令

chmod

用途:修改文件权限

案例:

[lxh@Rocky test]$ ll test.txt
-rw-rw-r--. 1 lxh lxh 4 Oct  6 23:44 test.txt
[lxh@Rocky test]$ 
[lxh@Rocky test]$ chmod 421 test.txt				# 421转换为r-- -w- --x
[lxh@Rocky test]$ ll test.txt
-r---w---x. 1 lxh lxh 4 Oct  6 23:44 test.txt
[lxh@Rocky test]$ 
[lxh@Rocky test]$ chmod u+w,g+x,o+r test.txt		# 为所有者添加w权限,为所属组添加x权限,为其他人添加r权限
[lxh@Rocky test]$ ll test.txt
-rw--wxr-x. 1 lxh lxh 4 Oct  6 23:44 test.txt
[lxh@Rocky test]$ 

chown

用途:修改文件的所有者和所属组

案例:

[root@Rocky test]# ll test.txt
-rw--wxr-x. 1 lxh lxh 4 Oct  6 23:44 test.txt
[root@Rocky test]# 
[root@Rocky test]# chown root test.txt				# 设置所有者为root
[root@Rocky test]# ll test.txt
-rw--wxr-x. 1 root lxh 4 Oct  6 23:44 test.txt
[root@Rocky test]# 
[root@Rocky test]# chown lxh:root test.txt			# 设置所有者为lxh,同时所属组为root
[root@Rocky test]# ll test.txt
-rw--wxr-x. 1 lxh root 4 Oct  6 23:44 test.txt
[root@Rocky test]# 
[root@Rocky test]# chown :lxh test.txt				# 设置所属组为lxh
[root@Rocky test]# ll test.txt
-rw--wxr-x. 1 lxh lxh 4 Oct  6 23:44 test.txt
[root@Rocky test]# 

特殊权限

Linux中的特殊权限有三种

  • SUID:只能作用于文件,效果为执行文件的用户,拥有该文件所有者的权限
  • SGID:能够作用于文件或者目录
    • 当作用于文件时,类似SUID,效果为执行文件的用户,拥有改文件所属组的权限
    • 当作用于目录时,该目录下新建的文件或目录的所属组,继承该目录的所属组
  • Sticky:只能作用于目录,效果为该目录下的文件或目录,只能被所有者删除(root无视该规则,均可删)
SUID SGID Sticky
符号所在位置 所有者的x位 所属组的x位 其他人的x位
对应符号 s / S s / S t / T

SUID

[lxh@Rocky test]$ cat /etc/shadow							# lxh权限不足以查看/etc/shadow
cat: /etc/shadow: Permission denied
[lxh@Rocky test]$ 
[lxh@Rocky test]$ su 
Password: 
[root@Rocky test]# 
[root@Rocky test]# whereis cat 
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[root@Rocky test]# 
[root@Rocky test]# ll /usr/bin/cat							# cat程序的所有者为root
-rwxr-xr-x. 1 root root 38528 Oct 21  2021 /usr/bin/cat
[root@Rocky test]# 
[root@Rocky test]# chmod u+s /usr/bin/cat					# 为cat添加SUID权限
[root@Rocky test]# 
[root@Rocky test]# ll /usr/bin/cat
-rwsr-xr-x. 1 root root 38528 Oct 21  2021 /usr/bin/cat
[root@Rocky test]# 
[root@Rocky test]# su - lxh
[lxh@Rocky ~]$ 
[lxh@Rocky ~]$ cat /etc/shadow								# lxh运行cat时,拥有root权限,可以查看/etc/shadow
root:$6$4tnhYORGuzauHknw$02x/AdUMqoUFLTryvZnoz2Nja89ZJvlaqhF7F9t9SqJzKZ3Rd1XkbhK3hllmPhTb9uvqjFD.xkF/1HZp9.DiG0::0:99999:7:::
bin:*:18700:0:99999:7:::
daemon:*:18700:0:99999:7:::
adm:*:18700:0:99999:7:::
lp:*:18700:0:99999:7:::
sync:*:18700:0:99999:7:::
...

SGID

[lxh@Rocky test]$ ls -ld testdir
drwxrwxr-x. 2 lxh lxh 6 Nov 11 01:00 testdir
[lxh@Rocky test]$ 
[lxh@Rocky test]$ chmod g+s testdir					# lxh为testdir添加SGID权限
[lxh@Rocky test]$ 
[lxh@Rocky test]$ ls -ld testdir
drwxrwsr-x. 2 lxh lxh 6 Nov 11 01:00 testdir
[lxh@Rocky test]$ 
[lxh@Rocky test]$ su 
Password: 
[root@Rocky test]# 
[root@Rocky test]# cd testdir/
[root@Rocky testdir]# 
[root@Rocky testdir]# mkdir rootdir					# root在testdir内创建文件和目录
[root@Rocky testdir]# touch rootfile
[root@Rocky testdir]# 
[root@Rocky testdir]# ls -ld rootdir rootfile		# root创建的文件和目录的所属组继承为testdir的所属组
drwxr-sr-x. 2 root lxh 6 Nov 11 01:01 rootdir
-rw-r--r--. 1 root lxh 0 Nov 11 01:01 rootfile
[root@Rocky testdir]# 

Sticky

[lxh@Rocky /]$ ls -dl tmp							# /tmp目录天生具有Sticky权限
drwxrwxrwt. 29 root root 4096 Nov 11 01:04 tmp
[lxh@Rocky /]$ 
[lxh@Rocky /]$ cd tmp
[lxh@Rocky tmp]$ 
[lxh@Rocky tmp]$ touch file_lxh						# lxh在/tmp中创建文件file_lxh
[lxh@Rocky tmp]$ 
[lxh@Rocky tmp]$ su tom
Password: 
[tom@Rocky tmp]$ 
[tom@Rocky tmp]$ touch file_tom						# tom在/tmp中创建文件file_tom
[tom@Rocky tmp]$ 
[tom@Rocky tmp]$ ls -ld file_tom file_lxh
-rw-rw-r--. 1 lxh lxh 0 Nov 11 01:05 file_lxh
-rw-rw-r--. 1 tom tom 0 Nov 11 01:05 file_tom
[tom@Rocky tmp]$ 
[tom@Rocky tmp]$ rm file_lxh						# lxh无法删除文件file_tom,即使lxh具有对/tmp的w权限
rm: remove write-protected regular empty file 'file_lxh'? y
rm: cannot remove 'file_lxh': Operation not permitted
[tom@Rocky tmp]$ 
[tom@Rocky tmp]$ su lxh
Password: 
[lxh@Rocky tmp]$ 
[lxh@Rocky tmp]$ rm file_tom						# tom无法删除文件file_lxh,即使tom具有对/tmp的w权限
rm: remove write-protected regular empty file 'file_tom'? y
rm: cannot remove 'file_tom': Operation not permitted
[lxh@Rocky tmp]$ 
[lxh@Rocky tmp]$ su 
Password: 
[root@Rocky tmp]# 
[root@Rocky tmp]# rm file_tom file_lxh				# root无视Sticky的限制,随意删除其他用户创建的文件
rm: remove regular empty file 'file_tom'? y
rm: remove regular empty file 'file_lxh'? y
[root@Rocky tmp]# 
[root@Rocky tmp]# ls file_tom file_lxh
ls: cannot access 'file_tom': No such file or directory
ls: cannot access 'file_lxh': No such file or directory
[root@Rocky tmp]# 

ACL

rwx权限体系中,仅仅只能将用户分成三种角色,如果要对单独用户设置额外的权限,则无法完成

ACL可以单独对指定的用户设定各不相同的权限;提供颗粒度更细的权限控制

ACL的相关命令

getfacl

用途:获取ACL权限

案例:

[lxh@Rocky test]$ getfacl test.txt
# file: test.txt
# owner: lxh
# group: lxh
user::rw-
group::-wx
other::r-x

[lxh@Rocky test]$ 

setfacl

用途:设置ACL权限,如何设置可以参考getfacl命令的输出

案例:

[lxh@Rocky test]$ getfacl test.txt
# file: test.txt
# owner: lxh
# group: lxh
user::rw-
group::-wx
other::r-x

[lxh@Rocky test]$ 
[lxh@Rocky test]$ setfacl -m user:lxh:wx test.txt		# 为lxh用户创建ACL权限
[lxh@Rocky test]$ 
[lxh@Rocky test]$ getfacl test.txt
# file: test.txt
# owner: lxh
# group: lxh
user::rw-
user:lxh:-wx
group::-wx
mask::-wx
other::r-x

[lxh@Rocky test]$ 
[lxh@Rocky test]$ setfacl -m user:tom:r test.txt		# 为tom用户创建ACL权限
[lxh@Rocky test]$ 
[lxh@Rocky test]$ getfacl test.txt
# file: test.txt
# owner: lxh
# group: lxh
user::rw-
user:lxh:-wx
user:tom:r--
group::-wx
mask::rwx
other::r-x

[lxh@Rocky test]$ 
[lxh@Rocky test]$ setfacl -x user:lxh: test.txt			# 删除lxh用户的ACL权限
[lxh@Rocky test]$ 
[lxh@Rocky test]$ getfacl test.txt
# file: test.txt
# owner: lxh
# group: lxh
user::rw-
user:tom:r--
group::-wx
mask::rwx
other::r-x

[lxh@Rocky test]$ 
[lxh@Rocky test]$ setfacl -b test.txt					# 删除关于文件的所有ACL权限
[lxh@Rocky test]$ 
[lxh@Rocky test]$ getfacl test.txt
# file: test.txt
# owner: lxh
# group: lxh
user::rw-
group::-wx
other::r-x

[lxh@Rocky test]$ 

文件时间戳

时间戳分类

  1. Access(atime):最后一次访问文件的时间点
  2. Modify(mtime):最后一次修改文件内容的时间点
  3. Change(ctime):最后一次更改文件状态(如权限、所有者、时间戳等)的时间点
  4. Birth(出生或者创建时间):这是文件被创建的时间,并非所有的文件系统都支持Birth时间

通过stat命令查看时间戳

[lxh@Rocky test]$ stat test.txt 
  File: test.txt
  Size: 4               Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d    Inode: 3456        Links: 1
Access: (0635/-rw--wxr-x)  Uid: ( 1000/     lxh)   Gid: ( 1000/     lxh)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2025-10-06 23:46:09.909960798 +0800
Modify: 2025-10-06 23:44:44.000000000 +0800
Change: 2025-11-11 01:35:44.780743390 +0800
 Birth: 2025-10-06 23:45:47.425961180 +0800
[lxh@Rocky test]$ 

通过touch命令更新时间戳

[lxh@Rocky test]$ touch test.txt 			# 默认更新atime、mtime以及ctime
[lxh@Rocky test]$ stat test.txt 
  File: test.txt
  Size: 4               Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d    Inode: 3456        Links: 1
Access: (0635/-rw--wxr-x)  Uid: ( 1000/     lxh)   Gid: ( 1000/     lxh)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2025-11-11 02:03:13.072694179 +0800
Modify: 2025-11-11 02:03:13.072694179 +0800
Change: 2025-11-11 02:03:13.072694179 +0800
 Birth: 2025-10-06 23:45:47.425961180 +0800
[lxh@Rocky test]$ 
[root@Rocky ~]# stat /etc/fstab
  File: /etc/fstab
  Size: 655             Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 134289539   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:etc_t:s0
Access: 2025-11-10 23:10:04.989004323 +0800
Modify: 2025-09-13 15:43:21.574526242 +0800
Change: 2025-09-13 15:58:58.224330855 +0800
 Birth: 2025-09-13 15:43:21.572528762 +0800
[root@Rocky ~]# 
[root@Rocky ~]# touch -a /etc/fstab			# 使用-a选项实现只更新atime和ctime
[root@Rocky ~]# 
[root@Rocky ~]# stat /etc/fstab
  File: /etc/fstab
  Size: 655             Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 134289539   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:etc_t:s0
Access: 2025-11-11 05:24:17.015334001 +0800
Modify: 2025-09-13 15:43:21.574526242 +0800
Change: 2025-11-11 05:24:17.015334001 +0800
 Birth: 2025-09-13 15:43:21.572528762 +0800
[root@Rocky ~]# 
[root@Rocky ~]# stat /var/lib/mlocate/mlocate.db 
  File: /var/lib/mlocate/mlocate.db
  Size: 3295759         Blocks: 6440       IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 1907766     Links: 1
Access: (0640/-rw-r-----)  Uid: (    0/    root)   Gid: (   21/ slocate)
Context: system_u:object_r:locate_var_lib_t:s0
Access: 2025-11-11 00:00:31.734913957 +0800
Modify: 2025-11-11 00:00:44.095913588 +0800
Change: 2025-11-11 00:00:44.097913588 +0800
 Birth: 2025-11-11 00:00:31.734913957 +0800
[root@Rocky ~]# 
[root@Rocky ~]# touch -m /var/lib/mlocate/mlocate.db 		# 使用-m选项实现只更新mtime和ctime
[root@Rocky ~]# 
[root@Rocky ~]# stat /var/lib/mlocate/mlocate.db 
  File: /var/lib/mlocate/mlocate.db
  Size: 3295759         Blocks: 6440       IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 1907766     Links: 1
Access: (0640/-rw-r-----)  Uid: (    0/    root)   Gid: (   21/ slocate)
Context: system_u:object_r:locate_var_lib_t:s0
Access: 2025-11-11 00:00:31.734913957 +0800
Modify: 2025-11-11 05:27:40.391327929 +0800
Change: 2025-11-11 05:27:40.391327929 +0800
 Birth: 2025-11-11 00:00:31.734913957 +0800
[root@Rocky ~]# 

find命令依据时间戳查找文件

[root@Rocky ~]# find ./ -amin +5 
./
./.bash_logout
./.bash_profile
./.bashrc				# 查找5分钟前访问过的文件,存在.bashrc
./.cshrc
./.tcshrc
./anaconda-ks.cfg
./.cache/dconf/user
./.dbus/session-bus/950475e784064038ac20234d8619ad8f-9
./initial-setup-ks.cfg
./.bash_history
./.viminfo
[root@Rocky ~]# touch -a .bashrc 		# 更新访问时间atime
[root@Rocky ~]# 
[root@Rocky ~]# find ./ -amin +5 		# 再次查找5分钟前访问过的文件,不存在.bashrc
./
./.bash_logout
./.bash_profile
./.cshrc
./.tcshrc
./anaconda-ks.cfg
./.cache/dconf/user
./.dbus/session-bus/950475e784064038ac20234d8619ad8f-9
./initial-setup-ks.cfg
./.bash_history
./.viminfo
[root@Rocky ~]# 

find与xargs

find是实时查找工具,通过遍历指定路径完成文件查找,速度略慢

find命令格式:find [OPTION] ... [查找路径] [查找条件] [处理动作]

  1. 查找路径:默认为当前工作目录
  2. 查找条件:默认没有条件限制,查找所有文件
  3. 处理动作:默认将文件名输出到标准输出

xargs可以读入stdin的数据,并且以空格符或回车符将stdin的数据分隔,使其成为另一个命令的参数

命令搭配案例

1.删除 /tmp下所有 .log文件(防止文件名中有空格)

[root@Rocky ~]# find /tmp -name "*.log" -print0 | xargs -0 rm -rf
# 解析:
find /tmp -name "*.log" -print0		# 使用通配符*.log找到.log结尾文件,输出使用 null 字符\0(ASCII 0)作为文件名分隔符
xargs -0 rm -rf		# 相应使用 null 字符作为参数分隔符,分隔后的参数丢给rm -rf执行

2.统计项目目录中所有 Python 文件的总行数

[root@Rocky ~]# find . -name "*.py" -print0 | xargs -0 wc -l
# 解析
find . -name "*.py" -print0		# 使用通配符*.py找到Python文件,使用 null 字符作为文件名分隔符
xargs -0 wc -l		# 相应使用 null 字符作为参数分隔符,使用wc -l统计文件行数

3.在所有 .conf文件中查找包含 "error" 的文件

[root@Rocky ~]# find /etc -name "*.conf" -print0 | xargs -0 grep -l "error"
# 解析
find /etc -name "*.conf" -print0		# 使用通配符*.conf找到配置文件
xargs -0 grep -l "error"		# 使用grep -l "error"显示存在"error"的文件的名称

4.将找到的文件复制到备份目录

find . -name "*.important" | xargs -I {} cp "{}" /backup/
# 解析
find . -name "*.important"		# 使用通配符*.important找到指定文件
xargs -I {} cp "{}" /backup/	# 将"{}"作为占位符使用,所有文件cp到/backup/目录下

压缩工具

compress

此工具来自于ncompress包,此工具目前已经很少使用

对应的文件是.Z后缀

compress选项

  • -d
    • 解压缩,相当于于uncompress
  • -c
    • 将压缩后的数据内容输出至标准输出,可以重定向到指定文件中,不删除原文件,默认会删除原文件
  • -f
    • 直接覆盖己存在目标文件
  • -v
    • 显示过程,会显示压缩率
  • -r
    • 递归压缩目录里面所有文件,注意不是压缩目录

gzip

来自于 gzip 包

对应的文件是.gz后缀

gzip选项

  • -d|--decompress
    • 解压缩,相当于gunzip
  • -k|--keep
    • 保留原文件
  • -c|--stdout
    • 将压缩数据输出到标准输出中,并保留原文件
  • -f|--force
    • 覆盖己存在目标文件
  • -l|--list
    • 针对.gz压缩文件使用,显示原文件大小,压缩文件大小,压缩比,压缩前文件名
  • -r|--recursive
    • 递归压缩目录内所有文件
  • -v|--verbose
    • 显示过程
  • -N
    • 指定压缩等级,取值为1-9之间,默认6
    • -1|--fast
      • 最快压缩,压缩比最底,但压缩速度快
    • -9|--best
      • 最好压缩,压缩比最高,但压缩速度慢
  • -q|--quiet
    • 安静模式,忽略警告
  • -S|--suffix=SUF
    • 指定压缩文件后缀,比如".XXX"
  • -t|--test
    • 测试,检测压缩文件是否完整

bzip2

来自于bzip2包

对应的文件是.bz2后缀

bzip2选项

  • -d|--decompress
    • 解压缩,相当于bunzip2
  • -k|--keep
    • 保留原文件
  • -c|--stdout
    • 将压缩数据输出到标准输出中,并保留原文件,可以进行重定向
  • -f|--force
    • 覆盖己存在目标文件
  • -v|--verbose
    • 显示过程
  • -N
    • 指定压缩等级,取值为1-9之间,默认9
    • -1|--fast
      • 最快压缩,压缩比最低,但压缩速度快
    • -9|--best
      • 最好压缩,压缩比最高,但压缩速度慢
  • -t|--test
    • 测试,检测压缩文件是否完整
  • -q|--quiet
    • 安静模式,忽略警告
  • -z|--compress
    • 强制压缩

xz

来自于xz包

对应的文件是.xz后缀

在五种压缩方式中,xz采用的压缩算法的压缩率最高,同时基本上也是压缩时间最长的

xz选项

  • -d|--decompress
    • 解压缩,相当于unxz
  • -k|--keep
    • 保留原文件
  • -l|--list
    • 查看压缩文件相关信息
  • -c|--stdout
    • 将压缩数据输出到标准输出中,并保留原文件
  • -f|--force
    • 覆盖己存在目标文件
  • -v|--verbose
    • 显示过程
  • -T|--threads=NUM
    • 开多线程,默认1
  • -N
    • 指定压缩等级,取值为1-9之间,默认6
  • -q|--quiet
    • 安静模式,忽略警告
  • -t|--test
    • 测试,检测压缩文件是否完整
  • -z|--compress
    • 强制压缩

zip

分别来自于zip和unzip包

对应的文件是.zip后缀

zip可以实现将目录和多个文件压缩成一个文件,但可能会丢失文件属性信息,如:所有者和组信息

zip选项

  • -d
    • 从压缩包内删除指定的文件(并不是解压缩出来)
  • -m
    • 将文件压缩之后,删除原始文件,默认不会删除
  • -u
    • 如果压缩包内有,则更新文件内容,如果没有,则追加进去
  • -f
    • 只会更换较新的文件到压缩文件内,如果没有该文件,那么也不会进行追加
  • -r
    • 递归压缩目录
    • 会针对整个目录的内容进行压缩,而不是单独压缩每个文件,最后得到的是一个压缩文件
  • -z
    • 给压缩包加注释,unzip -z 查看注释
    • 如果想要删除注释,可以直接添加空注释
  • -N
    • 指定压缩等级,取值为1-9之间
    • -1
      • 最快压缩,数字1
    • -9
      • 最高压缩比,数字9
  • -v
    • 显示过程
  • -x
    • 压缩时排除指定文件
  • -P 解压密码
    • 压缩时加密码

tar

tar即TapeARchive磁带归档,可以对目录和多个文件打包成一个文件进行归档

此命令可以保留文件属性,推荐使用

本身不具备压缩功能,但可以使用参数调用相应的压缩命令进行压缩:前提是当前系统中有安装该压缩工具

对应的打包文件是.tar后缀

tar选项

  • -f|--file=ARCHIVE
    • 指定压缩包文件,大多数必选
  • -c|--create
    • 创建一个新归档,如果要压缩文件,也是先打包归档再压缩
  • -x|--extract|--get
    • 从归档中解出文件
    • 可以直接将.tgz | .tbz2 | .txz | .tar.gz | .tar.bz2 | .tar.xz | .gz | .bz2 | .xz 后缀的压缩文件解压并解包
  • -C|--directory=DIR
    • 指定目录
  • -r|--append
    • 追加文件至归档结尾
  • -u|--update
    • 仅追加比归档中副本更新的文件
  • -t|--list
    • 列出归档内容
  • -v|--verbose
    • 列出详细信息
  • --delete
    • 从归档中删除,并不会解包出来
  • --exclude
    • 排除文件
  • -z
    • 相当于gzip压缩工具
    • 需要配合-c选项使用,因为是先打包后压缩
    • 创建的压缩文件后缀可以把tar.gz简写为tgz
  • -j
    • 相当于bzip2压缩工具
    • 创建的压缩文件后缀可以把tar.bz2简写为tbz2
  • -J
    • 相当于xz压缩工具
    • 创建的压缩文件后缀可以把tar.xz简写为txz
posted @ 2025-11-11 08:19  林浩233  阅读(1)  评论(0)    收藏  举报