第4章 更多的bash shell命令

本章内容

  • 管理进程
  • 获取磁盘统计信息
  • 挂载新磁盘
  • 排序数据
  • 归档数据

4.1 监测程序

4.1.1 探查进程
默认情况下,ps命令并不会提供那么多的信息:
[jingpan@localhost ~]$ ps
  PID TTY          TIME CMD
24493 pts/0    00:00:00 bash
24524 pts/0    00:00:00 ps
[jingpan@localhost ~]$ 

没什么特别的吧?  默认情况下,ps命令只会显示运行在当前控制台下的属于当前用户的进程。在此例中,我们只运行了bash shell
(注意,shell 也只是运行在系统上的另一个程序而已),以及ps命令自己。
上便中的基本输出显示了程序的进程号(PID,Process ID)、它们运行在哪个终端(TTY)以及进程已用CPU时间。

1.Unix风格的参数
-e    显示所有进程
-f  显示完整格式输出
使用ps命令的关键不在于记住所有可用的参数,而在于记住对你最有用的那些参数。大多数Linux系统管理员有自己的一组参数,
他们会牢牢记住这些用来提取有用的进程信息的参数。举个例子,如果你想查看系统上运行的所有进程,可用-ef参数组合:
[root@localhost ~]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 12月01 ?      00:00:26 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root         2     0  0 12月01 ?      00:00:00 [kthreadd]
root         3     2  0 12月01 ?      00:00:01 [ksoftirqd/0]
root         5     2  0 12月01 ?      00:00:00 [kworker/0:0H]
root         7     2  0 12月01 ?      00:00:00 [migration/0]
root         8     2  0 12月01 ?      00:00:00 [rcu_bh]
root         9     2  0 12月01 ?      00:02:59 [rcu_sched]
root        10     2  0 12月01 ?      00:00:07 [watchdog/0]
root        12     2  0 12月01 ?      00:00:00 [kdevtmpfs]
root        13     2  0 12月01 ?      00:00:00 [netns]
root        14     2  0 12月01 ?      00:00:00 [khungtaskd]
root        15     2  0 12月01 ?      00:00:00 [writeback]
root        16     2  0 12月01 ?      00:00:00 [kintegrityd]
root        17     2  0 12月01 ?      00:00:00 [bioset]
root        18     2  0 12月01 ?      00:00:00 [kblockd]
root        19     2  0 12月01 ?      00:00:00 [md]
root        22     2  0 12月01 ?      00:00:00 [kswapd0]
root        23     2  0 12月01 ?      00:00:00 [ksmd]
root        24     2  0 12月01 ?      00:00:02 [khugepaged]
root        25     2  0 12月01 ?      00:00:00 [crypto]
root        33     2  0 12月01 ?      00:00:00 [kthrotld]
root        35     2  0 12月01 ?      00:00:00 [kmpath_rdacd]
root        36     2  0 12月01 ?      00:00:00 [kpsmoused]
root        37     2  0 12月01 ?      00:00:00 [ipv6_addrconf]
root        56     2  0 12月01 ?      00:00:00 [deferwq]
root        90     2  0 12月01 ?      00:00:00 [kauditd]
root       268     2  0 12月01 ?      00:00:00 [ata_sff]
root       273     2  0 12月01 ?      00:00:00 [scsi_eh_0]
root       274     2  0 12月01 ?      00:00:00 [scsi_tmf_0]
root       275     2  0 12月01 ?      00:00:00 [scsi_eh_1]
root       276     2  0 12月01 ?      00:00:00 [scsi_tmf_1]
root       285     2  0 12月01 ?      00:00:00 [ttm_swap]
root       290     2  0 12月01 ?      00:00:16 [kworker/0:1H]
root       355     2  0 12月01 ?      00:00:00 [kdmflush]
root       356     2  0 12月01 ?      00:00:00 [bioset]
root       367     2  0 12月01 ?      00:00:00 [kdmflush]
root       368     2  0 12月01 ?      00:00:00 [bioset]

上例中,我们略去了输出中的不少行,以节约空间。但如你所看到的,Linux系统上运行着很多的进程。这个例子用了两个参数:
-e参数指定显示所有运行在系统上的进程;-f参数则扩展了输出,这些扩展的列包含了有用的信息.
UID:启动这些进程的用户
PID:进程的进程号(PID)
PPID:父进程的进程号(如果该进程是由另一个进程启动的)。
C:进程生命周期中的CPU利用率。
STIME:进程启动时的系统时间。
TTY:进程启动时的终端设备
TIME:运行进程需要的累计CPU时间
CMD:启动的程序名称
上例中输出了合理数量的信息,这也正是大多数系统管理员希望看到的。如果想要获得更多
的信息,可采用-l参数,它会产生一个长格式输出:
[root@localhost log]# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0 28585 24493  0  80   0 - 41518 do_wai pts/0    00:00:00 su
4 S     0 28594 28585  0  80   0 - 27121 do_wai pts/0    00:00:00 bash
4 R     0 30101 28594  0  80   0 - 27036 -      pts/0    00:00:00 ps

注意使用了-l参数之后出现的那些额外的列。
F:内核分配给进程的系统标记。
S:进程的状态(0代表下在运行;S代表正在休眠;R代表可运行,正等待运行;Z代表僵化,进程
 已结束但父进程已不存在;T代表停止)。
PRI:进程的优先级(越大的数字代表越低的优先级)。
NI:谦让度(nice)值用来参与决定优先级。
ADDR:进程的内存地址。
SZ:假如进程被换出,所需交换空间的大致大小。
 WCHAN:进程休眠的内核函数的地址。

-H参数能把输出的进程组织成一个层级的格式,简单地说就是树状。你可以很轻松地看懂哪些进程启动了哪些进程。
以下是从加参数-efH的输出中截取下来的片段:
root     24488  1972  0 16:11 ?        00:00:00     sshd: jingpan [priv]
jingpan  24492 24488  0 16:11 ?        00:00:00       sshd: jingpan@pts/0
jingpan  24493 24492  0 16:11 pts/0    00:00:00         -bash
jingpan  30764 24493  0 17:11 pts/0    00:00:00           ps -efH

注意CMD这列输出内容的平移,它表明运行中程序的层级:首先是root用户启动的sshd进程,然后,由于这个会话是从
远程的终端连接到系统上的,SSH主进程启动了一个终端进程(pts/0),之后终端又启动了bash shell。
那之后,ps命令作为bash进程的子进程开始运行了。在多用户系统上,在定位失控的进程或跟踪这些进程属于哪个
userid或终端时,这个工具非常有用。
2.BSD风格的参数
 参数     描述
  a         显示跟任意终端关联的所有进程
  g   显示所有的进程,包括控制进程
  x    显示所有的进程,甚至包括未分配任何终端的进程
 l         采用长模式
在使用BSD参数时,ps命令会自动改变输出以模仿BSD格式。下例是使用l参数的输出:

[jingpan@localhost ~]$ ps l
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0   500  3098  3097  20   0 108480  1880 do_wai Ss   pts/1      0:00 -bash
0   500  3562  3561  20   0 108480  1912 do_wai Ss   pts/4      0:00 -bash
0   500  3603  3562  20   0 100952   604 inotif S+   pts/4      0:00 tail -f /home/jingpan/collector/log/agent.log
0   500  4673  4672  20   0 108480  1880 do_wai Ss   pts/3      0:00 -bash
0   500  4699  4673  20   0 108140   996 -      R+   pts/3      0:00 ps l
其中大部分的输出跟我们使用Unix风格参数时的输出是一样的,只有一小部分不同。
VSZ:进程在内存中的大小,以午字节(kB)为单位。
RSS:进程在未换出时占用的物理内存。
STAT:代表当前进程状态的双字符状态码。
第一个字符采用了和Unix风格S列的输出相同的值,说明进程是在休眠、运行还是等待。第二个参数
进一步说明进程的状态。
      • <:该进程运行在高优先级上。
      • N:该进程运行在低优先级上。
      • L:该进程有页面锁定在内存中。
      • s:该进程是个控制进程。
      • l:该进程是多线程的。
+:该进程运行在前端。
从前面的例子可以看出,bash命令处于休眠状态,但同时它也是一个控制进程(在我会话中,这是主要的进程)。
而ps命令则运行在系统的前端.
3.GNU全字参数
 参数     描述
--forest    用层级结构显示出进程和父进程之间的关系
--headers  在每页输出中都显示列的头

--forest参数。它会显示进程的层级信息,并用ACSII字符绘出可爱的图表:
root      1972     1  0 10:27 ?        00:00:00 /usr/sbin/sshd
root      3095  1972  0 10:31 ?        00:00:00  \_ sshd: jingpan [priv]
jingpan   3097  3095  0 10:31 ?        00:00:00  |   \_ sshd: jingpan@pts/1
jingpan   3098  3097  0 10:31 pts/1    00:00:00  |       \_ -bash
root      3269  3098  0 10:41 pts/1    00:00:00  |           \_ su root
root      3272  3269  0 10:41 pts/1    00:00:00  |               \_ bash
root      4670  1972  0 11:53 ?        00:00:00  \_ sshd: jingpan [priv]
jingpan   4672  4670  0 11:53 ?        00:00:00      \_ sshd: jingpan@pts/3
jingpan   4673  4672  0 11:53 pts/3    00:00:00          \_ -bash
jingpan   5773  4673  0 13:02 pts/3    00:00:00              \_ ps -ef --forest
这种格式便得跟踪子进程和父进程变得十分容易。

4.1.2 实时监测进程

top命令
图4-1是top命令运行时输出的截图。
输出的第一部分显示的是系统的概况:第一行显示了当前时间、系统的运行时间、登录的用户数以及系统的平均负载。
平均负载有3个值:最近1分钟的、最近5分钟的和最近15分钟的平均负载。值越大说明系统的负载越高。最近1分钟的负载
值很高也很常见,因为有时会有进程突然开始活动;但如果15分钟平均负载都很高,说明系统可能有问题了。


_____________________________________________________________________________________________________________
说明 Linux系统管理的要点在于如何定义系统的高负载。 这个值取决于系统的硬件配置以及系统上通常运行
的程序,对某个系统来说是高负载的值可能对另一个系统来说就是个正常值。通常,如果系统的负载值超过了
2,就说明系统比较繁忙了。
——————————————————————————————————————————————
第二行显示了概要的进程信息-----top命令的输出中进程叫做任务(task):多少进程处在运行、休眠、停止或是僵化状态。
下一行显示了CPU信息。top根据进程的属主(用户还是系统)和进程的状态(运行‘空闲还是等待)将CPU利用率分成
几类输出。
紧跟其后的两行说明了系统内存的状态。前行说的是系统的物理内存:总共有多少内存,当前用了多少,还有多少空闲。
后一行说的是同样的信息。不过是针对系统交换空间(如果分配了的话)的状态 来说的。

        默认情况下,top命令在启动时会按照%CPU值来排序。

%CPU = CPU usage

%MEM = Memory usae(RES) 

VIRT  = Virtual Image(kb) 进程占用虚拟内存总量

RES  = Resident size (kb)  进程占用的物理内存总量

SHR = Shared Mem size(kb)

命令                            描述

f                           添加/移除输出中不同信息列

o                        更改信息行的显示顺序

F或O                    选择一列来将进程排序(默认为%CPU)

R                        切换正常排序还是倒序排序

4.1.3 结束进程

Linux沿用了Unix进行进程间通信的方法。在Linux上,进程之间通过信息来通信。进程的信息

就是预定义好的一个消息,进程能识别它并决定忽略还是作出反应。

信号                        名称                        描述

1                                HUP                       挂起

2                                 INt                       中断

9                                 KILL                   无条件终止

15                               TERM                尽可能终止

要发送进程信号,你必须是进程的属主或登录为root用户。

1.kill命令
[jingpan@localhost ~]$ kill 2582
-bash: kill: (2582) - 不允许的操作
TERM信号告诉进程可能的话停止运行。不过,如果有跑飞的进程,它通常会忽略这个请求。
如果要强制终止,-s参数支持指定其他信号(用信号名或信号值)。

通常可接受的处理方式是先试试TERM信号。如果进程忽略它,可用INT或HUP信号。程序收到了这些信号,

会在关掉进程前有序地停止它正在做的事。KILL信号的强制性最强。当进程接收到这个信号时,它会立即停止运行。

这可能会导致文件损坏。

2.killall命令

killall命令非常强大,它支持通过进程名而不是进程号来结束进程。killall命令也支持通配符,这在系统因

负载过大而变得很慢很慢时很有用。

[jingpan@localhost ~]$ killall httpd*

上便的命令结束了所有以http开头的进程,比如Apache Web服务器的httpd服务。


4-2 监测磁盘空间

4.2.1 挂载存储媒体

1.mount命令

默认情况下,mount命令会输出当前系统上挂载的设备列表:

[root@localhost jingpan]# mount
/dev/sda1 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
/home/kvm/centos72.iso on /mnt type iso9660 (rw,loop=/dev/loop0)

 
[jingpan@localhost ~]#mount -t iso9660 -o loop centos72.iso /mnt

mount 命令会将镜像centos72.iso文件当做真实cd来挂载,用户就能访问它的文件系统了。

2.umount命令

umount命令支持通过设备文件或者是挂载点来指定卸载的设备。如果有任何程序正在使用

设备上的文件,系统就不会允许你来卸载它。

[root@localhost jingpan]# umount /home/kvm/centos72.iso 
umount: /mnt: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))


如果在卸载设备时,系统提示设备繁忙,无法卸载设备,通常是有进程还在访问该设备或使用该设备上的文件。

这时可用lsof命令获得使用它的进程信息,然后在应用中停止使用该设备或停止该进程。


[root@localhost jingpan]# lsof /mnt
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME
bash    8461 jingpan  cwd    DIR    7,0     2048 21312 /mnt/images

4.2.2    使用df命令

有时你需要知道在某个设备上还有多少磁盘空间。df命令就是用来轻松查看所有已挂载磁盘的使用情况
[root@localhost jingpan]# df
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda1      453034512 18062116 411952876   5% /
tmpfs            2026904       76   2026828   1% /dev/shm

df命令有一些命令行参数可用,但基本上你不会用到。一个常用的参数是-h.它会把输出中的

磁盘空间按人类可读的形式显示,通常用M来替代兆字节,用G替代吉字节:

[root@localhost jingpan]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       433G   18G  393G   5% /
tmpfs           2.0G   76K  2.0G   1% /dev/shm


4.2.3 使用du命令

 通过df 命令,你很容易发现哪个磁盘就快要没存储空间了。系统管理员面临的下一个总量是发生这种情况时怎么办。

另一个有用的命令是du命令。du命令可以显示某个特定目录(默认情况下是当前目录)的磁盘使用情况。这是

用来判断你系统上某个目录下是不是有超大文件的快速方法。

默认情况下,du命令会显示当前目录下的有的文件、目录和子目录的磁盘使用情况,它会以磁盘的块为单位来显示每个

文件或目录占用了多大存储。在标准的主目录中,这个输出会是一个比较长的列表。下面是du命令的部分输出:

[root@localhost etc]# du 
20      ./redhat-lsb
4       ./gnupg
4       ./sssd
20      ./PackageKit
12      ./sysconfig/modules
12      ./sysconfig/cbq
8       ./sysconfig/networking/profiles/default
12      ./sysconfig/networking/profiles
4       ./sysconfig/networking/devices
20      ./sysconfig/networking
4       ./sysconfig/console
232     ./sysconfig/network-scripts
520     ./sysconfig
3960    ./selinux/targeted/modules/active/modules
13100   ./selinux/targeted/modules/active
13104   ./selinux/targeted/modules
8284    ./selinux/targeted/policy
4       ./selinux/targeted/logins
28      ./selinux/targeted/contexts/users
592     ./selinux/targeted/contexts/files
676     ./selinux/targeted/contexts
22080   ./selinux/targeted
22100   ./selinux
56      ./xinetd.d
4       ./dbus-1/session.d
156     ./dbus-1/system.d
172     ./dbus-1
8       ./dhcp/dhclient-exit-hooks.d
12      ./dhcp/dhclient.d
24      ./dhcp
8       ./cron.monthly
8       ./audit/rules.d
20      ./audit
4       ./alternatives
4       ./terminfo
4       ./maven/fragments
12      ./maven
4       ./cgconfig.d
28      ./yum.repos.d
84      ./init
24      ./ld.so.conf.d
8       ./rsyslog.d
16      ./latrace.d/sysdeps/x86_64
20      ./latrace.d/sysdeps
168     ./latrace.d
4       ./lsb-release.d
16      ./httpd/conf.d
56      ./httpd/conf
76      ./httpd
8       ./kde/env
12      ./kde
12      ./oddjobd.conf.d
40      ./bash_completion.d
4       ./hal/fdi/preprobe
4       ./hal/fdi/policy
4       ./hal/fdi/information
16      ./hal/fdi
20      ./hal
4       ./cron.weekly
4       ./ssl
8       ./prelink.conf.d
12      ./alsa
8       ./portreserve
8       ./bluetooth
8       ./avahi
8       ./purple
144     ./postfix
4       ./skel/.gnome2
4       ./skel/.mozilla/plugins
4       ./skel/.mozilla/extensions
12      ./skel/.mozilla

每行输出开始地方的数值,是每个文件或目录占用的磁盘块数。注意这个列表昌从一个目录层级的最底部开始的,

然后按文件、子目录、目录逐级向上。

du命令(不加参数,用默认参数)作用并不大。

-c:显示所有已列出文件总的大小。

-h:按人类可读的格式输出大小,

-s:显示每个输出参数的总计。

4.3 处理数据文件


当你有大量数据时,通常很难处理这些信息及提取有用信息。

Linux系统提供了一些命令行工具秋处理大量数据。本节将会介绍每个系统管理员以及每个

日常Linux用户都应该知道的、能叫生活轻松的基本命令。


4.3.1 排序数据

处理大量数据时的一个常用命令是sort命令。从

默认情况下,sort命令按你为这个会话指定的默认语言的排序规则来对对文本文件中的数据进行排序。

[root@localhost ch4]# cat file1
one
two
three
four
five
[root@localhost ch4]# sort file1
five
four
one
three
two

相当简单。但事情并非总是像看起那么简单。看下面的例子:

[root@localhost ch4]# cat file2
1
2
100
45
3
10
145
75
[root@localhost ch4]# sort file2
1
10
100
145
2
3
45
75
你期望这些数字能按值排序,但叫你失望了。默认情况下,sort命令会把数字当做字符而执行
标准的字符排序,产生的输出可以能根本不是你要的。解决这个问题可用-n参数,它会告诉

sort命令把数字识别成数字而不是字符,并且将它们按值排序:

[root@localhost ch4]# sort -n file2
1
2
3
10
45
75
100
145
现在的结果是不是好多了?另一个常用的参数是-M,按月排序。Linux的日志文件经常会在每行
的起始位置有一个时间戳,用来表明事件是什么时候发生的:

Nov 06 13:52:10 Installed: tigervnc-server-1.1.0-24.el6.x86_64
如果将含有时间戳日期的文件按默认的排序方法来排序,会得到类似于下面的结果:

[root@localhost ch4]# sort file3
Apr
Aug
Dec
Feb
Jan
Jul
Jun
Mar
May
Nov
Oct
Sep


-n参数在排序数值时非常有用,比如du命令的输出:
[root@localhost jingpan]# du -s * | sort -rn
104424  net-snmp-5.7.2
69784   boot
18192   nginx-1.12.2
6136    net-snmp.tar.gz
1492    collector
664     c
376     awk
80      linux_c
68      c_v
60      c_example
32      linux
32      collector-linux.zip
12      test
8       snmp_install.sh
4       桌面
4       音乐
4       下载
4       文档
4       图片
4       视频
4       模板
4       公共的
4       rpm_check.txt
4       LICENCE.KEY
4       ch5
4       centos7.xml
4       centos74.xml
注意,-r 参数让结果按降序输出,这样就更容易看到目录下的哪些文件占用空间最多。

4.3.2 搜索数据

你会经常需要大文件中找一行数据,而这行数据埋藏在文件的中间。这时,你并不需要人工看完整个文件,你只需要 grep命令

来帮查找。

grep 命令会到输入中或你指定的文件中查找包含匹配指定模式的字符行。grep的输出就是包含了匹配模式的行。

[jingpan@localhost ch4]$ grep three file1
three
[jingpan@localhost ch4]$ grep t file1
two
three
[jingpan@localhost ch4]$ 

第一个例子在文件file1中搜索能匹配模式three的文本,grep命令输出了匹配了该模式的行。

第二个例子在文件file1中搜索能匹配模式t的文本。这个例子里,file1中有两行匹配了指定的模式,两行都输出了。

如果要进行反向搜索(输出不匹配该模式的行),可加-v参数:

[jingpan@localhost ch4]$ grep -v t file1
one
four
five
[jingpan@localhost ch4]$ 

v如果要显示匹配模式的行所在的行号,可加-n参数:

[jingpan@localhost ch4]$ grep -n t file1
2:two
3:three

如果只要知道多少行包含有匹配的模式,可以-c参数:

[jingpan@localhost ch4]$ grep -c t file1
2

如果要指定多于一个匹配模式,得到满足两个模式中任意一个的所有结果,用-e参数来指定每个模式:

[jingpan@localhost ch4]$ grep -e t -e f file1
two
three
four
five

这个例子输出了含有字符t或f的所有行。

默认情况下,grep命令用基本的Unix风格正则表达式来匹配模式。Unix风格正则表达式采用特殊字符来定义怎样查找匹配的

模式。

这里有个简单在grep搜索中使用正则表达式的例子。

[jingpan@localhost ch4]$ grep [tf] file1
two
three
four
five
正则表达式中的方括号个表明grep应该搜索包含t 或者f字符的匹配。如果不用正则表达式,grep就会搜索匹配字符串tf的文本。

4.3.3压缩数据

1.bzip2工具

默认情况下,bzip2命令尝试压缩原始文件,并用压缩后的文件(同样的文件名后加.bz2扩展)替换它:

[root@localhost ch4]# ls -l
总用量 248
-rw-r--r-- 1 root root     24 2月  26 17:17 file1
-rw-r--r-- 1 root root     23 2月  26 17:19 file2
-rw-r--r-- 1 root root     48 2月  27 10:42 file3
-rwxr-xr-x 1 root root 239000 2月  28 10:02 myprog
[root@localhost ch4]# bzip2 myprog 
[root@localhost ch4]# ls -l
总用量 124
-rw-r--r-- 1 root root     24 2月  26 17:17 file1
-rw-r--r-- 1 root root     23 2月  26 17:19 file2
-rw-r--r-- 1 root root     48 2月  27 10:42 file3
-rwxr-xr-x 1 root root 111880 2月  28 10:02 myprog.bz2

bzip2命令自动用压缩后的bzip2文件替换了原文件,.bz2扩展名说明我们采用什么技术进行压缩的。

解压文件用bunzip2命令:

[root@localhost ch4]# bunzip2 myprog.bz2 
[root@localhost ch4]# ls -l
总用量 248
-rw-r--r-- 1 root root     24 2月  26 17:17 file1
-rw-r--r-- 1 root root     23 2月  26 17:19 file2
-rw-r--r-- 1 root root     48 2月  27 10:42 file3
-rwxr-xr-x 1 root root 239000 2月  28 10:02 myprog

如你所见,解压后的文件又回到了原文件大小。如果压缩了文本文件,你无法再用cat、more或less

命令来查看文件的内容。这时,你可以用bzcat命令:

[root@localhost ch4]# bzip2 file1
[root@localhost ch4]# ls
file1.bz2  file2  file3  myprog
[root@localhost ch4]# bzcat file1.bz2 
one
two
three
four
five
bzcat命令显示了压缩文件里的文本内容,而并不需要解压文件。

2.gzip工具

到目前为止,Linux上最流行的文件压缩工具就是gzi工具了。gzip包是GNU项目发起的试图替代原来Unix

的compress工具的压缩工具。

这些工具基本上跟bzip2工具的用法一样:

[root@localhost ch4]# gzip myprog 
[root@localhost ch4]# ls -l my*
-rwxr-xr-x 1 root root 114811 2月  28 10:02 myprog.gz
[root@localhost ch4]# 

gzip命令会压缩命令行指定的文件。你也可以在命令行指定几个文件名甚至用通配符来一次压缩几个文件:

 
 
[root@localhost ch4]# gzip my*
[root@localhost ch4]# ls -l my*
-rwxr-xr-x 1 root root 114813 2月  28 11:24 myprog.c.gz
-rwxr-xr-x 1 root root 114811 2月  28 10:02 myprog.gz
-rw-r--r-- 1 root root     31 2月  28 11:25 myscript__.gz
-rw-r--r-- 1 root root     29 2月  28 11:25 myscript.gz

gzip命令会压缩该目录中匹配通配符的每个文件。

3 zip工具

zip工具的强大之处在于,它能将整个目录下的文件都压缩进单个文件。这让它成为归档整个目录结构的理想工具。

[root@localhost linux]# zip -r ch4.zip ch4
  adding: ch4/ (stored 0%)
  adding: ch4/myprog.gz (deflated 0%)
  adding: ch4/myscript.gz (deflated 17%)
  adding: ch4/file2 (deflated 4%)
  adding: ch4/file3 (deflated 2%)
  adding: ch4/myprog.c.gz (deflated 0%)
  adding: ch4/myscript__.gz (deflated 16%)
  adding: ch4/file1.bz2 (stored 0%)
[root@localhost linux]# ls

这个例子创建了一个叫ch4.zip的zip文件,并递归目录ch4把找到的每个文件和目录都加进

该 zip文件。从输出可以看出。不是所有存进该zip文件的文件都能够被压缩。zip工具自动决定

针对每个单独文件的压缩类型。

4.3.4 归档数据

目前,Unix和Linux上最广泛使用的归档工具是tar命令

[jingpan@localhost linux]$ tar -cvf ch4.tar ch4/
ch4/
ch4/myprog.gz
ch4/myscript.gz
ch4/file2
ch4/file3
ch4/myprog.c.gz
ch4/myscript__.gz
ch4/file1.bz2

上面命令创建了一个含有ch4目录内容的ch4.tar的归档文件。

[jingpan@localhost linux]$ tar -tf ch4.tar 
ch4/
ch4/myprog.gz
ch4/myscript.gz
ch4/file2
ch4/file3
ch4/myprog.c.gz
ch4/myscript__.gz
ch4/file1.bz2

列出tar文件ch4.tar的内容,但并不解压谁的。

[root@localhost linux]# tar -xvf ch4.tar 
ch4/
ch4/myprog.gz
ch4/myscript.gz
ch4/file2
ch4/file3
ch4/myprog.c.gz
ch4/myscript__.gz
ch4/file1.bz2

如果tar文件是从一个目录结构创建的,那整个目录结构都会在当前目录下重新创建。

下载了开源软件之后,你会经常看到文件名以.tgz结尾。这些是gzip压缩过的tar文件,可以用命令

tar -zxvf filename.tgz





猜你喜欢

转载自blog.csdn.net/tjjingpan/article/details/79261166