Linux系统开发: 命令进阶学习(一)
一、解压缩命令介绍
linux下最常用的打包程序是tar命令,使用tar打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的,生成tar包后,就可以用其它的程序来进行压缩了。
1.1.1 tar命令介绍
功能:tar是一个压缩解压工具。利用tar,用户可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案,如软盘。利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。Linux上的tar是GNU版本的。
语法:tar [主选项+辅选项] <目标文档> <源文件或者目录>
使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用。
参数:
c 创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。
r 把要存档的文件追加到档案文件的未尾。例如用户已经作好备份文件,又发现还有一个目录或是一些文件忘记备份了,这时可以使用该选项,将忘记的目录或文件追加到备份文件中。
t 列出档案文件的内容,查看已经备份了哪些文件。
u 更新文件。就是说,用新增的文件取代原备份文件,如果在备份文件中找不到要更新的文件,则把它追加到备份文件的最后。
x 从档案文件中释放文件。
注意:c/x/t 仅能存在一个!不可同时存在!
辅助选项:
b 该选项是为磁带机设定的。其后跟一数字,用来说明区块的大小,系统预设值为20(20*512 bytes)。
f 使用档案文件或设备,这个选项通常是必选的。请留意,在 f 之后要立即接档名喔!不要再加参数!
k 保存已经存在的文件。例如我们把某个文件还原,在还原的过程中,遇到相同的文件,不会进行覆盖。
m 在还原文件时,把所有文件的修改时间设定为现在。
M 创建多卷的档案文件,以便在几个磁盘中存放。
v 详细报告tar处理的文件信息。如无此选项,tar不报告文件信息。
w 每一步都要求确认。
z 用gzip来压缩/解压缩文件,后缀名为.gz,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩。
j 用bzip2来压缩/解压缩文件,后缀名为.bz2,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩。
1.1.2 tar命令解压/压缩使用范例
将/test目录下的所有文件打包为test.tar文件。
# tar -cvf test.tar /test
注意:如果打包的文件或者目录是绝对路径,可能会出现提示:tar: 从成员名中删除开头的“/”
在参数中加上-P即可消除。
示例:
# tar -cvPf test.tar /test
解压打包的.tar文件
# tar -xvf test.tar
更新文件
就是说,用新增的文件取代原备份文件,如果在备份文件中找不到要更新的文件,则把它追加到备份文件的最后。
# tar -uf test.tar 123.c
列出已经打包的文件,可以用于查看已经备份了哪些文件。
# tar -tf test.tar
使用gzip来压缩/解压缩文件
# tar -czf test.tar.gz test/ //压缩
# tar -xzf test.tar.gz //解压
使用bzip2来压缩/解压缩文件
# tar -cjf test.tar.bz2 test/ //压缩
# tar -xjf test.tar.bz2 //解压
1.1.3 ZIP格式压缩/解压
linux下提供了zip和unzip程序对ZIP格式压缩包进行处理,zip是压缩程序,unzip是解压程序。它们的参数选项很多,下面只做简单介绍。
将所有.jpg的文件压缩成一个zip包
# zip all.zip *.jpg
将all.zip中的所有文件解压出来
# unzip all.zip
常用参数:
-r 递 归处理,将指定目录下的所有文件和子目录一并处理。
压缩指定目录下的所有文件
# zip -r 123.zip /test/
二、磁盘操作相关命令介绍
1.2.1 fdisk命令:磁盘分区
Linux下的fdisk功能是极其强大的,用它可以划分出最复杂的分区。
查看设备的详细信息。# fdisk -l
在console上输入fdisk/dev/sda,可进入分割硬盘模式。
输入m显示所有命令列示。
输入p显示硬盘分割情形。
输入a设定硬盘启动区。
输入n设定新的硬盘分割区。
输入e硬盘为[延伸]分割区(extend)。
输入p硬盘为[主要]分割区(primary)。
输入t改变硬盘分割区属性。
输入d删除硬盘分割区属性。
输入q结束不存入硬盘分割区属性。
输入w结束并写入硬盘分割区属性。
1.2.2 dd命令:磁盘备份命令
dd是Linux/UNIX 下的一个非常有用的命令,作用是将一个指定文件拷贝到磁盘的指定块。可以用于磁盘备份、程序烧写等应用。
基本语法: dd iflag=dsync oflag=dsync if=<输入文件> of=<输出的文件> seek=<跳过的块数量>
dd命令的主要选项:
if=file
输入文件名,缺省为标准输入。
of=file
输出文件名,缺省为标准输出。
ibs=bytes
一次读入 bytes 个字节(即一个块大小为 bytes 个字节)。
obs=bytes
一次写 bytes 个字节(即一个块大小为 bytes 个字节)。
bs=bytes
同时设置读写块的大小为 bytes ,可代替 ibs 和 obs 。
cbs=bytes
一次转换 bytes 个字节,即转换缓冲区大小。
skip=blocks
从输入文件开头跳过 blocks 个块后再开始复制。
seek=blocks
从输出文件开头跳过 blocks 个块后再开始复制。(通常只有当输出文件是磁盘或磁带时才有效)。
count=blocks
仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数。
conv=conversion[,conversion...]
用指定的参数转换文件。
数字:b=512 ,k=1024
运用实例
修复硬盘
dd if=/dev/sda of=/dev/sda
当硬盘较长时间(比如1,2年)放置不使用后,磁盘上会产生magnetic flux point(磁通点)。当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数据起死回生。且这个过程是安全,高效的。
清除磁盘数据
# dd if=/dev/urandom /dev/sdb
利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。执行此操作以后,/dev/sdb将无法挂载,创建和拷贝操作无法执行。 其中的/dev/urandom是产生随机数的文件。
也可以直接获取随机数据:
# dd if=/dev/urandom of=123.dat bs=1024k count=2
其中bs表示每一个块的大小是1024kb。count就表示块数量。 加起来就会拷贝(1024*2)kb的数据
磁盘备份
dd if=/dev/sdb of=disk.img
将磁盘数据备份到当前目录的disk.img文件。备份之后可以使用压缩软件打开。如果需要恢复直接将参数变换个位置。
dd if= disk.img of=/dev/sdb
从光盘拷贝iso镜像
dd if=/dev/cdrom of=/root/cd.iso
拷贝光盘数据到root文件夹下,并保存为cd.iso文件。
程序烧写
dd iflag=dsync oflag=dsync if=123.bin of=/dev/sdb seek=1057
将123.bin文件拷贝到/dev/sdb设备中,seek表示跳过1057个块之后再进行拷贝。
1.2.3 mount命令:挂载硬盘或镜像
mount命令用于挂载磁盘分区或者网络文件系统。
语法:mount -t [文件系统类型] [将要挂载的设备] [-o 选项] [挂载的目标目录]
注: 通过-t这个参数,我们来指定文件系统的类型,一般的情况下不指定也能自动识加。-t 后面跟 ext3 、ext2 、reiserfs、vfat 、ntfs、nfs 等;可以通过查看mount的帮助文档进行查看详细信息。
-o 主要用来描述设备或档案的挂接方式。常用的参数有:
loop:用来把一个文件当成硬盘分区挂接上系统
ro:采用只读方式挂接设备
rw:采用读写方式挂接设备
iocharset:指定访问文件系统所用字符集
运用实例
挂载SD卡分区到指定目录
# mount /dev/sdb2 /test/
将sdb2设备挂载到/test目录下。
如果挂载之后需要取消,可以使用umount命令。
# umount /test/
挂载光盘映像文件到指定目录
# mount 123.iso -o loop /test/
将123.iso文件当成硬盘挂载到/test目录下。
将一个目录挂载到另一个目录下
# mount --bind /work/ /test/
相当于使用ln建立链接一样效果。
使用mount命令挂载NFS网络文件系统
# mount -t nfs 192.168.11.123:/work /test/
如果挂载提示设备资源上锁,可以使用下面方式进行挂载:
# mount -t nfs -o nolock 192.168.11.123:/work /test/
其中192.168.11.123表示服务器的IP地址,/work表示NFS服务器共享的目录。/test/表示本地挂载的目录。
搭建NFS服务器方法
首先设置将要共享的路径。
编辑/etc/exports文件,示例:
/work/ *(rw,no_root_squash,sync)
重启NFS服务器
# service nfs restart
1.3 文件搜索与修改
1.3.1 find命令:搜索文件
命令功能:用于在文件树种查找文件,并作出相应的处理。
语法:find [查找的路径] [选项] [表达式]
命令选项
-name
按照文件名查找文件。
-perm
按照文件权限来查找文件。
-prune
使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
-user
按照文件属主来查找文件。
-group
按照文件所属的组来查找文件。
-mtime -n +n
按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。
-nogroup
查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser
查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-newer file1 ! file2
查找更改时间比文件file1新但比文件file2旧的文件。
-type
查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
-size n:
[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth :
在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype:
查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount :
在查找文件时不跨越文件系统mount点。
-follow:
如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio :
对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
-amin n
查找系统中最后N分钟访问的文件
-atime n
查找系统中最后n*24小时访问的文件
-cmin n
查找系统中最后N分钟被改变文件状态的文件
-ctime n
查找系统中最后n*24小时被改变文件状态的文件
-mmin n
查找系统中最后N分钟被改变文件数据的文件
-mtime n
查找系统中最后n*24小时被改变文件数据的文件
根据文件名查找文件
# find /work/ -name 123.c
在/work目录下查找名称为123.c的文件。
根据通配符进行查找文件
# find /work/ -name "*.c"
在/work目录下查找以.c为后缀的文件。注意:该查找方式区分大小写。
不区分大小写的方式:
# find /work/ -iname "*.c"
同时查找多个文件
# find /work/ -name "*.txt" -o -name "*.c" -o -name "*.h"
在/work目录下查找以.c、.txt、.h为后缀的文件。 主要参数是-o。
匹配路径或者文件
# find /work/ -path "*mplayer*"
在/work目录下查找包含mplayer字符的文件和目录。
根据正则表达式查找
# find /work/ -regex ".*\.h∥\.c
\.
h
‖
\.
c
$"
否定参数
# find /work/ ! -name "*.c"
在/work目录下查找不是以.c为后缀的文件。
根据文件类型搜索
# find /work/ -type f
在/work目录下查找类型为f的普通文件。
常用的类型:f 普通文件、 l 符号连接、 d 目录、 c 字符设备、 b 块设备、 s 套接字、 p Fifo管道文件
根据文件大小进行匹配
# find /work/ -type f -size 200k
在/work目录下查找类型为f的普通文件,并且文件的大小为200k。
文件大小单元:
b —— 块(512字节)
c —— 字节
w —— 字(2字节)
k —— K字节
M —— 兆字节
G —— G字节
常用大小搜索方式:
搜索大于100KB的文件 # find /work/ -type f -size +100k
搜索小于100KB的文件 # find /work/ -type f -size -100k
搜索等于100KB的文件 # find /work/ -type f -size 100k
根据文件时间戳进行搜索
UNIX/Linux文件系统每个文件都有三种时间戳:
访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
最近七天内被访问过的所有文件:find /work -type f -atime -7
搜索恰好在七天前被访问过的所有文件: find /work -type f -atime 7
搜索超过七天内被访问过的所有文件: find /work -type f -atime +7
搜索访问时间超过10分钟的所有文件: find /work -type f -amin +10
找出比file.log修改时间更长的所有文件: find . -type f -newer file.log
查找并删除指定文件
find /test/ -work f -name "*.c" -delete
在work目录下查找以.c为后缀的文件,并将其删除。
根据权限进行查找
# find /work/ -type f -perm 777
在/work目录下搜索出权限为777的文件。
借助-exec选项与其他命令结合使用
查找并删除指定的文件
# find /work/ -name "*.txt" -ok rm {} \;
# find /work/ -name "*.txt" -exec rm {} \;
在work目录下查找以.txt为后缀的文件,将其全部删除。
其中-ok和-exec行为一样,不过-ok会给出提示,是否执行相应的操作,而-exec不会提示,直接执行。
{} 用于与-exec和-ok选项结合使用来匹配所有文件。
查找并拷贝文件
# find /work/ -name "*.txt" -exec cp {} /opt/ \;
在work目录下查找以.txt为后缀的文件,将其全部拷贝到/opt目录下。
执行多条命令的方法
因为单行命令中-exec参数中无法使用多个命令,我们可以将命令写成脚本,然后使用-exec进行调用。
# find /work/ -name "*.txt" -exec ./text.sh {} \;
{}是匹配所有文件,传递给脚本之后,在脚本中使用$1获取传入的参数信息。
脚本文件中的代码示例: echo $1
1.3.2 grep命令:文本搜索工具
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
语法:grep [选项] [文件]
主要选项:
-c
只输出匹配行的计数。
-i
不区分大 小写(只适用于单字符)。
-h
查询多文件时不显示文件名。
-l
查询多文件时只输出包含匹配字符的文件名。
-n
显示匹配行及行号。
-s
不显示不存在或无匹配文本的错误信息。
-v
显示不包含匹配文本的所有行。
正则表达式主要参数:
\
忽略正则表达式中特殊字符的原有含义。
^
匹配正则表达式的开始行。
$
匹配正则表达式的结束行。
\<
从匹配正则表达 式的行开始。
\>
到匹配正则表达式的行结束。
[ ]
单个字符,如[A]即A符合要求 。
[ - ]
范围,如[A-Z],即A、B、C一直到Z都符合要求 。
。
所有的单个字符。
*
有字符,长度可以为0。
使用实例
搜索文本并添加文本
grep -q "12345" /work/test.txt || echo "12345" >> /work/test.txt
在/work/test.txt文件中搜索12345这个字符串数据,如果有就不执行||后面的代码,如果没有,就执行||后面的代码。-q在这里是将grep变为类似于if的效果。
同时搜索多个文件
# grep "A" /work/*.c
在work目录下以.c后缀的文件中搜索A这个数据,如果搜索成功,会将A出现的行打印到屏幕上。
搜索输出行与行号
# grep -n "data" 123.c
在123.c文件中搜索data数据,搜索成功后将data所在的行与行号全部打印出来。
大小写敏感
# grep -i "data" 123.c
输出所有含有data或DAT的字符串的行。
1.3.3 sed命令:在线编辑器
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
Sed本质上是一个编辑器,但是它是非交互式的,这点与VIM不同;同时它又是面向字符流的,输入的字符流经过Sed的处理后输出。这两个特性使得Sed成为命令行下面非常有用的一个处理工具。
sed的处理流程,简化后是这样的:
读入新的一行内容到缓存空间;
从指定的操作指令中取出第一条指令,判断是否匹配pattern;
如果不匹配,则忽略后续的编辑命令,回到第2步继续取出下一条指令;
如果匹配,则针对缓存的行执行后续的编辑命令;完成后,回到第2步继续取出下一条指令;
当所有指令都应用之后,输出缓存行的内容;回到第1步继续读入下一行内容;
当所有行都处理完之后,结束;
语法:
sed [-hnV][-e