文件编辑、查找、查看
1 文件查找和比较
1 diff
diff命令在最简单的情况下,比较给定的两个文件的不同。如果使用“-”代替“文件”参数,则要比较的内容将来自标准输入。diff命令是以逐行的方式,比较文本文件的异同处。如果该命令指定进行目录的比较,则将会比较该目录中具有相同文件名的文件,而不会对其子目录文件进行任何比较操作。
语法
1 | diff(选项)(参数) |
选项
1 | -<行数>:指定要显示多少行的文本。此参数必须与-c或-u参数一并使用; |
参数
- 文件1:指定要比较的第一个文件;
- 文件2:指定要比较的第二个文件。
实例
将目录/usr/li下的文件”test.txt”与当前目录下的文件”test.txt”进行比较,输入如下命令:
1 | diff /usr/li test.txt #使用diff指令对文件进行比较 |
上面的命令执行后,会将比较后的不同之处以指定的形式列出,如下所示:
1 | n1 a n3,n4 |
其中,字母”a”、”d”、”c”分别表示添加、删除及修改操作。而”n1”、”n2”表示在文件1中的行号,”n3”、”n4”表示在文件2中的行号。
注意:以上说明指定了两个文件中不同处的行号及其相应的操作。在输出形式中,每一行后面将跟随受到影响的若干行。其中,以<开始的行属于文件1,以>开始的行属于文件2。
2 cmp
cmp命令用来比较两个文件是否有差异。当相互比较的两个文件完全一样时,则该指令不会显示任何信息。若发现有差异,预设会标示出第一个不通之处的字符和列数编号。若不指定任何文件名称或是所给予的文件名为“-”,则cmp指令会从标准输入设备读取数据。
语法
1 | cmp(选项)(参数) |
选项
1 | -c或--print-chars:除了标明差异处的十进制字码之外,一并显示该字符所对应字符; |
参数
目录:比较两个文件的差异。
实例
使用cmp命令比较文件”testfile”和文件”testfile1”两个文件,则输入下面的命令:
1 | cmp testfile testfile1 #比较两个指定的文件 |
3 locate/slocate
locate命令和slocate命令都用来查找文件或目录。
locate命令其实是find -name
的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb
,这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
语法
1 | locate/slocate(选项)(参数) |
选项
1 | -d<目录>或--database=<目录>:指定数据库所在的目录; |
参数
1 | 查找字符串:要查找的文件名中含有的字符串。 |
实例
搜索etc目录下所有以sh开头的文件:
1 | locate /etc/sh |
搜索用户主目录下,所有以m开头的文件:
1 | locate ~/m |
搜索用户主目录下,所有以m开头的文件,并且忽略大小写:
1 | locate -i ~/m |
4 which
which命令用于查找并显示给定命令的绝对路径,环境变量PATH中保存了查找命令时需要遍历的目录。which指令会在环境变量$PATH设置的目录里查找符合条件的文件。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
语法
1 | which(选项)(参数) |
选项
1 | -n<文件名长度>:制定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名; |
参数
1 | 指令名:指令名列表。 |
实例
查找文件、显示命令路径:
1 | [root@localhost ~]# which pwd |
说明:which是根据使用者所配置的 PATH 变量内的目录去搜寻可运行档的!所以,不同的 PATH 配置内容所找到的命令当然不一样的!
5 find
find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
语法
1 | find(选项)(参数) |
选项
1 | -amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算; |
参数
1 | 起始目录:查找文件的起始目录。 |
实例
根据文件或者正则表达式进行匹配
列出当前目录及子目录下所有文件和文件夹
1 | find . |
在/home
目录下查找以.txt结尾的文件名
1 | find /home -name "*.txt" |
同上,但忽略大小写
1 | find /home -iname "*.txt" |
当前目录及子目录下查找所有以.txt和.pdf结尾的文件
1 | find . \( -name "*.txt" -o -name "*.pdf" \) |
匹配文件路径或者文件
1 | find /usr/ -path "*local*" |
基于正则表达式匹配文件路径
1 | find . -regex ".*\(\.txt\|\.pdf\)$" |
同上,但忽略大小写
1 | find . -iregex ".*\(\.txt\|\.pdf\)$" |
否定参数
找出/home下不是以.txt结尾的文件
1 | find /home ! -name "*.txt" |
根据文件类型进行搜索
1 | find . -type 类型参数 |
基于目录深度搜索
向下最大深度限制为3
1 | find . -maxdepth 3 -type f |
搜索出深度距离当前目录至少2个子目录的所有文件
1 | find . -mindepth 2 -type f |
根据文件时间戳进行搜索
1 | find . -type f 时间戳 |
搜索最近七天内被访问过的所有文件
1 | find . -type f -atime -7 |
搜索恰好在七天前被访问过的所有文件
1 | find . -type f -atime 7 |
搜索超过七天内被访问过的所有文件
1 | find . -type f -atime +7 |
搜索访问时间超过10分钟的所有文件
1 | find . -type f -amin +10 |
找出比file.log修改时间更长的所有文件
1 | find . -type f -newer file.log |
根据文件大小进行匹配
1 | find . -type f -size 文件大小单元 |
搜索大于10KB的文件
1 | find . -type f -size +10k |
搜索小于10KB的文件
1 | find . -type f -size -10k |
搜索等于10KB的文件
1 | find . -type f -size 10k |
删除匹配文件
删除当前目录下所有.txt文件
1 | find . -type f -name "*.txt" -delete |
根据文件权限/所有权进行匹配
当前目录下搜索出权限为777的文件
1 | find . -type f -perm 777 |
找出当前目录下权限不是644的php文件
1 | find . -type f -name "*.php" ! -perm 644 |
找出当前目录用户tom拥有的所有文件
1 | find . -type f -user tom |
找出当前目录用户组sunk拥有的所有文件
1 | find . -type f -group sunk |
2 文件内容查看
1 cut
cut命令用来显示行中的指定部分,删除文件中指定字段。cut经常用来显示文件的内容,类似于下的type命令。
说明:该命令有两项功能,其一是用来显示文件的内容,它依次读取由参数file所指 明的文件,将它们的内容输出到标准输出上;其二是连接两个或多个文件,如cut fl f2 > f3
将把文件fl和几的内容合并起来,然后通过输出重定向符“>”的作用,将它们放入文件f3中。
当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容。因此,一般用more等命令分屏显示。为了控制滚屏,可以按Ctrl+S键,停止滚屏;按Ctrl+Q键可以恢复滚屏。按Ctrl+C(中断)键可以终止该命令的执行,并且返回Shell提示符状态。
语法
1 | cut(选项)(参数) |
选项
1 | -b:仅显示行中指定直接范围的内容; |
参数
文件:指定要进行内容过滤的文件。
实例
例如有一个学生报表信息,包含No、Name、Mark、Percent:
1 | [root@localhost text]# cat test.txt |
使用 -f 选项提取指定字段:
1 | [root@localhost text]# cut -f 1 test.txt |
1 | [root@localhost text]# cut -f2,3 test.txt |
**–complement **选项提取指定字段之外的列(打印除了第二列之外的列):
1 | [root@localhost text]# cut -f2 --complement test.txt |
使用 -d 选项指定字段分隔符:
1 | [root@localhost text]# cat test2.txt |
1 | [root@localhost text]# cut -f2 -d";" test2.txt |
指定字段的字符或者字节范围
cut命令可以将一串字符作为列来显示,字符字段的记法:
- **N-**:从第N个字节、字符、字段到结尾;
- N-M:从第N个字节、字符、字段到第M个(包括M在内)字节、字符、字段;
- -M:从第1个字节、字符、字段到第M个(包括M在内)字节、字符、字段。
上面是记法,结合下面选项将摸个范围的字节、字符指定为字段:
- -b 表示字节;
- -c 表示字符;
- -f 表示定义字段。
示例
1 | [root@localhost text]# cat test.txt |
打印第1个到第3个字符:
1 | [root@localhost text]# cut -c1-3 test.txt |
打印前2个字符:
1 | [root@localhost text]# cut -c-2 test.txt |
打印从第5个字符开始到结尾:
1 | [root@localhost text]# cut -c5- test.txt |
2 tail
tail命令用于输入文件中的尾部内容。tail命令默认在屏幕上显示指定文件的末尾10行。如果给定的文件不止一个,则在显示的每个文件前面加一个文件名标题。如果没有指定文件或者文件名为“-”,则读取标准输入。
语法
1 | tail(选项)(参数) |
选项
1 | --retry:即是在tail命令启动时,文件不可访问或者文件稍后变得不可访问,都始终尝试打开文件。使用此选项时需要与选项“——follow=name”连用; |
参数
文件列表:指定要显示尾部内容的文件列表。
实例
1 | tail file (显示文件file的最后10行) |
3 head
head命令用于显示文件的开头的内容。在默认情况下,head命令显示文件的头10行内容。
语法
1 | head(选项)(参数)cd (选项) (参数) |
选项
1 | -n<数字>:指定显示头部内容的行数; |
参数
1 | 文件列表:指定显示头部内容的文件列表。 |
4 less
less命令的作用与more十分相似,都可以用来浏览文字档案的内容,不同的是less命令允许用户向前或向后浏览文件,而more命令只能向前浏览。用less命令显示文件时,用PageUp键向上翻页,用PageDown键向下翻页。要退出less程序,应按Q键。
语法
1 | less(选项)(参数) |
选项
1 | -b <缓冲大小> 设置缓冲区的大小 |
参数
1 | 文件:指定要分屏显示内容的文件。 |
5 more
more命令是一个基于vi编辑器文本过滤器,它以全屏幕的方式按页显示文本文件的内容,支持vi中的关键字定位操作。more名单中内置了若干快捷键,常用的有H(获得帮助信息),Enter(向下翻滚一行),空格(向下滚动一屏),Q(退出命令)。
- 按Space键:显示文本的下一屏内容。
- 按Enier键:只显示文本的下一行内容。
- 按斜线符
|
:接着输入一个模式,可以在文本中寻找下一个相匹配的模式。 - 按H键:显示帮助屏,该屏上有相关的帮助信息。
- 按B键:显示上一屏内容。
- 按Q键:退出rnore命令。
语法
1 | more(语法)(参数) |
选项
1 | -<数字>:指定每屏显示的行数; |
参数
1 | 文件:指定分页显示内容的文件。 |
实例
显示文件file的内容,但在显示之前先清屏,并且在屏幕的最下方显示完核的百分比。
1 | more -dc file |
3 文本编辑
vi命令是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器。Linux中的vi编辑器叫vim,它是vi的增强版(vi Improved),与vi编辑器完全兼容,而且实现了很多增强功能。
vi命令使用的一些选项及含义:
-c sub-command 在对指定的文件编辑前,先执行指定的命令 sub-command .
-r filename 恢复指定的文件filename .
-R 将指定的文件以只读的方式放入编辑器中,这样不会保存对文件的任何修 改。
-y number 将编辑窗口的大小设为number行。
1 三种模式
命令模式 控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。
**文本输入模式 **只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。
**命令项模式 **将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。
不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。
2 相关快捷键操作
1 退出vi及保存
在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,例如:
1 | : w filename (输入 「w filename」将文章以指定的文件名filename保存) |
2 移动光标
1 | h 将光标左移一格。 |
删除文字
1 | 「x」:每按一次,删除光标所在位置的"后面"一个字符。 |
复制
1 | 「yw」:将光标所在之处到字尾的字符复制到缓冲区中。 |
命令模式下用来查找字符串所使用的子命令
1 | /pattern 向后寻找指定的pattern ,若遇到文件尾,则从头再开始。 |
命令模式下改变文本所使用的子命令
3 文本模式
文本输入模式下用来输入文本的子命令
1 | a 在光标之后开始输入文本。 |
4 其它快捷键
保存文件的子命令
1 | :w 回写修改后的文件。 |
vi中其他的子命令
1 | ctrl+g 取得正在编辑文件的有关信息。 |
缩进
在可视模式下选择要移动的列,操作为,
- esc从编辑模式退到命令模式,将光标移到需要缩进的行的行首,然后按shift+v,可以看到该行已被选中,且左下角提示为“可视”
- 按键盘上的上下左右方向键,如这里按向下的箭头,选中所有需要批量缩进的行
-
5 vi 下的替换
1 | :s/name/title/ #替换当前行第一个 name 为 title |
4 文件处理
1 touch
touch命令有两个功能:一是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来;二是用来创建新的空文件。
语法
1 | touch(选项)(参数) |
选项
1 | -a:或--time=atime或--time=access或--time=use 只更改存取时间; |
参数
1 | 文件:指定要设置时间属性的文件列表。 |
实例
显示文件file的内容,但在显示之前先清屏,并且在屏幕的最下方显示完核的百分比。
1 | more -dc file |
2 ln
ln命令用来为文件创件连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接。如果要创建符号连接必须使用”-s”选项。
注意:符号链接文件不是一个独立的文件,它的许多属性依赖于源文件,所以给符号链接文件设置存取权限是没有意义的。
语法
1 | ln(选项)(参数) |
选项
1 | -b或--backup:删除,覆盖目标文件之前的备份; |
参数
- 源文件:指定连接的源文件。如果使用
-s
选项创建符号连接,则“源文件”可以是文件或者目录。创建硬连接时,则“源文件”参数只能是文件; - 目标文件:指定源文件的目标连接文件。
实例
将目录/usr/mengqc/mub1
下的文件m2.c链接到目录/usr/liu
下的文件a2.c
1 | cd /usr/mengqc |
在目录/usr/liu
下建立一个符号链接文件abc,使它指向目录/usr/mengqc/mub1
1 | ln -s /usr/mengqc/mub1 /usr/liu/abc |
5 文件传输
1 scp
scp命令用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读read only system时,用scp可以帮你把文件移出来。另外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。虽然 rsync比scp会快一点,但当小文件众多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。
语法
1 | scp(选项)(参数) |
选项
1 | -1:使用ssh协议版本1; |
参数
- 源文件:指定要复制的源文件。
- 目标文件:目标文件。格式为
user@host:filename
(文件名为目标文件的名称)。
实例
从远程复制到本地的scp命令与上面的命令雷同,只要将从本地复制到远程的命令后面2个参数互换顺序就行了。
从远处复制文件到本地目录
1 | scp root@10.10.10.10:/opt/soft/nginx-0.5.38.tar.gz /opt/soft/ |
从远处复制到本地
1 | scp -r root@10.10.10.10:/opt/soft/mongodb /opt/soft/ |
上传本地文件到远程机器指定目录
1 | scp /opt/soft/nginx-0.5.38.tar.gz root@10.10.10.10:/opt/soft/scptest |
上传本地目录到远程机器指定目录
1 | scp -r /opt/soft/mongodb root@10.10.10.10:/opt/soft/scptest |
6 文件过滤分割与合并
1 split
split命令可以将一个大文件分割成很多个小文件,有时需要将文件分割成更小的片段,比如为提高可读性,生成日志等。
选项
1 | -b:值为每一输出档案的大小,单位为 byte。 |
实例
生成一个大小为100KB的测试文件:
1 | [root@localhost split]# dd if=/dev/zero bs=100k count=1 of=date.file |
使用split命令将上面创建的date.file文件分割成大小为10KB的小文件:
1 | [root@localhost split]# split -b 10k date.file |
文件被分割成多个带有字母的后缀文件,如果想用数字后缀可使用-d参数,同时可以使用-a length来指定后缀的长度:
1 | [root@localhost split]# split -b 10k date.file -d -a 3 |
为分割后的文件指定文件名的前缀:
1 | [root@localhost split]# split -b 10k date.file -d -a 3 split_file |
使用-l选项根据文件的行数来分割文件,例如把文件分割成每个包含10行的小文件:
1 | split -l 10 date.file |
2 grep
grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
选项
1 | -a 不要忽略二进制数据。 |
实例
在文件中搜索一个单词,命令会返回一个包含“match_pattern”的文本行:
1 | grep match_pattern file_name |
在多个文件中查找:
1 | grep "match_pattern" file_1 file_2 file_3 ... |
输出除之外的所有行 **-v **选项:
1 | grep -v "match_pattern" file_name |
标记匹配颜色 –color=auto 选项:
1 | grep "match_pattern" file_name --color=auto |
使用正则表达式 -E 选项:
1 | grep -E "[1-9]+" |
只输出文件中匹配到的部分 **-o **选项:
1 | echo this is a test line. | grep -o -E "[a-z]+\." |
统计文件或者文本中包含匹配字符串的行数 -c 选项:
1 | grep -c "text" file_name |
输出包含匹配字符串的行数 **-n **选项:
1 | grep "text" -n file_name |
打印样式匹配所位于的字符或字节偏移:
1 | echo gun is not unix | grep -b -o "not" |
搜索多个文件并查找匹配文本在哪些文件中:
1 | grep -l "text" file1 file2 file3... |
grep递归搜索文件
在多级目录中对文本进行递归搜索:
1 | grep "text" . -r -n |
忽略匹配样式中的字符大小写:
1 | echo "hello world" | grep -i "HELLO" |
选项** -e** 制动多个匹配样式:
1 | echo this is a text line | grep -e "is" -e "line" -o |
grep静默输出:
1 | grep -q "test" filename |
3 printf
printf命令格式化并输出结果到标准输出。
选项
1 | printf(选项)(参数) |
参数
输出类型:
- %ns:输出字符串。n 是数字,指输出几个字符;
- %ni:输出整数。n 是数字,指输出几个数字‘’
- %m.nf: 输出浮点数。m 和 n 是数字,指输出的整数位数和小数位数。如 %8.2f 代表共输出 8 位数,其中 2 位是小数,6 位是整数;
输出格式:
- \a: 输出警告声音;
- \b:输出退格键,也就是 Backspaced 键;
- \f:清除屏幕;
- \n:换行;
- \r:回车,也就是 Enter 键;
- \t:水平输出退格键,也就是 Tab 键;
- \v:垂直输出退格键,也就是 Tab 键;
实例
创建 student.txt 文件。文件内容如下:
1 | [root@localhost ~]# vi student.txt |
使用 printf 命令输出这个文件的内容,如下:
1 | [root@localhost ~]# printf '%s' $(cat student.txt) |
printf 命令如果不指定输出格式,则会把所有输出内容连在一起输出。其实文本的输出本身就是这样的,cat 等文本输出命令之所以可以按照格式漂亮地输出,那是因为 cat 命令已经设定了输出格式。
为了用 printf 输出合理的格式,应该这样做:
1 | [root@localhost ~]# printf '%s\t %s\t %s\t %s\t %s\t %s\t\n' $(cat student.txt) |
在 printf 命令的单引号中输入的任何空格都不会反映到格式输出中,只有格式输出符号才能影响 printf 命令的输出结果。
因为我们的文档有6列,所以使用 6 个”%s”代表这 6 列字符串,每个字符串之间用”\t”分隔;最后还要加入”\n”,使得每行输出都换行,否则这些数据还是会连成一行的。
如果不想把成绩当成字符串输出,而是按照整型和浮点型输出,则要这样做:
1 | [root@localhost ~]# printf '%i\t %s\t %i\t %i\t %i\t %8.2f\t\n'\ $(cat student.txt | grep -v Name) |
先解释”cat student.txt|grep -v Name”这条命令。这条命令会把第一行标题取消,剩余的内容才用 printf 格式化输出。在剩余的内容中,第 1、3、4、5 列为整型,所以用”%i”输出;而第 2 列是字符串,所以用”%s”输出;而第 6 列是小数,所以用”%8.2f”输出。”%8.2f”代表可以输出 8 位数,其中有 2 位是小数,有 6 位是整数。
4 wc
wc命令用来计算数字。利用wc指令我们可以计算文件的Byte数、字数或是列数,若不指定文件名称,或是所给予的文件名为“-”,则wc指令会从标准输入设备读取数据。
语法
1 | wc(选项)(参数) |
选项
1 | -c 统计字节数。 |
参数
文件:需要统计的文件列表。
实例
查看文件的字节数、字数、行数
1 | [root@localhost test]# cat test.txt |
用wc命令怎么做到只打印统计数字不打印文件名
1 | [root@localhost test]# wc -l test.txt |
用来统计当前目录下的文件数
1 | [root@localhost test]# cd test6 |
7 文件压缩与解压
1 zip
zip命令可以用来解压缩文件,或者对文件进行打包操作。zip是个使用广泛的压缩程序,文件经它压缩后会另外产生具有“.zip”扩展名的压缩文件。
语法
1 | zip(选项)(参数) |
选项
1 | -A:调整可执行的自动解压缩文件; |
参数
- zip压缩包:指定要创建的zip压缩包;
- 文件列表:指定要压缩的文件列表。
实例
将/home/Blinux/html/
这个目录下所有文件和文件夹打包为当前目录下的html.zip:
1 | zip -q -r html.zip /home/Blinux/html |
上面的命令操作是将绝对地址的文件及文件夹进行压缩,以下给出压缩相对路径目录,比如目前在Bliux这个目录下,执行以下操作可以达到以上同样的效果:
1 | zip -q -r html.zip html |
比如现在我的html目录下,我操作的zip压缩命令是:
1 | zip -q -r html.zip * |
2 gzip
gzip命令用来压缩文件。gzip是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多处“.gz”扩展名。
语法
1 | gzip(选项)(参数) |
选项
1 | -a或——ascii:使用ASCII文字模式; |
参数
文件列表:指定要压缩的文件列表。
实例
把test6目录下的每个文件压缩成.gz文件
1 | gzip * |
把上例中每个压缩的文件解压,并列出详细的信息
1 | gzip -dv * |
详细显示例1中每个压缩的文件的信息,并不解压
1 | gzip -l * |
压缩一个tar备份文件,此时压缩文件的扩展名为.tar.gz
1 | gzip -r log.tar |
递归的压缩目录
1 | gzip -rv test6 |
这样,所有test下面的文件都变成了*.gz,目录依然存在只是目录里面的文件相应变成了*.gz.这就是压缩,和打包不同。因为是对目录操作,所以需要加上-r选项,这样也可以对子目录进行递归了。
1 | gzip -dr test6 |
3 unzip
unzip命令用于解压缩由zip命令压缩的“.zip”压缩包。
语法
1 | unzip(选项)(参数) |
选项
1 | -c:将解压缩的结果显示到屏幕上,并对字符做适当的转换; |
参数
压缩包:指定要解压的“.zip”压缩包。
实例
将压缩文件text.zip在当前目录下解压缩。
1 | unzip test.zip |
将压缩文件text.zip在指定目录/tmp
下解压缩,如果已有相同的文件存在,要求unzip命令不覆盖原先的文件。
1 | unzip -n test.zip -d /tmp |
查看压缩文件目录,但不解压。
1 | unzip -v test.zip |
将压缩文件test.zip在指定目录/tmp
下解压缩,如果已有相同的文件存在,要求unzip命令覆盖原先的文件。
1 | unzip -o test.zip -d tmp/ |
4 tar
tar命令可以为linux的文件和目录创建档案。利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案。利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。
首先要弄清两个概念:打包和压缩。打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件。
为什么要区分这两个概念呢?这源于Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2命令)。
语法
1 | tar(选项)(参数) |
选项
1 | -A或--catenate:新增文件到以存在的备份文件; |
参数
文件或目录:指定要打包的文件或目录列表。
实例
将文件全部打包成tar包:
1 | tar -cvf log.tar log2012.log 仅打包,不压缩! |
在选项f
之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。 如果加z
选项,则以.tar.gz或.tgz来代表gzip压缩过的tar包;如果加j
选项,则以.tar.bz2来作为tar包名。
查阅上述tar包内有哪些文件:
1 | tar -ztvf log.tar.gz |
由于我们使用 gzip 压缩的log.tar.gz,所以要查阅log.tar.gz包内的文件时,就得要加上z
这个选项了。
将tar包解压缩:
1 | tar -zxvf /opt/soft/test/log.tar.gz |
在预设的情况下,我们可以将压缩档在任何地方解开的
只将tar内的部分文件解压出来:
1 | tar -zxvf /opt/soft/test/log30.tar.gz log2013.log |
我可以透过tar -ztvf
来查阅 tar 包内的文件名称,如果单只要一个文件,就可以透过这个方式来解压部分文件!
文件备份下来,并且保存其权限:
1 | tar -zcvpf log31.tar.gz log2014.log log2015.log log2016.log |
这个-p
的属性是很重要的,尤其是当您要保留原本文件的属性时。
在文件夹当中,比某个日期新的文件才备份:
1 | tar -N "2012/11/13" -zcvf log17.tar.gz test |
备份文件夹内容是排除部分文件:
1 | tar --exclude scf/service -zcvf scf.tar.gz scf/* |
其实最简单的使用 tar 就只要记忆底下的方式即可:
1 | 压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称 |
8 软件包管理
1 yum
yum命令是在Fedora和RedHat以及SUSE中基于rpm的软件包管理器,它可以使系统管理人员交互和自动化地更细与管理RPM软件包,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。
yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。
语法
1 | yum(选项)(参数) |
选项
1 | -h:显示帮助信息; |
参数
1 | install:安装rpm软件包; |
实例
部分常用的命令包括:
- 自动搜索最快镜像插件:
yum install yum-fastestmirror
- 安装yum图形窗口插件:
yum install yumex
- 查看可能批量安装的列表:
yum grouplist
安装
1 | yum install #全部安装 |
更新和升级
1 | yum update #全部更新 |
查找和显示
1 | yum info package1 #显示安装包信息package1 |
删除程序
1 | yum remove | erase package1 #删除程序包package1 |
清除缓存
1 | yum clean packages #清除缓存目录下的软件包 |
9 rpm
rpm命令是RPM软件包的管理工具。rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎。逐渐受到其他发行版的采用。RPM套件管理方式的出现,让Linux易于安装,升级,间接提升了Linux的适用度。
语法
1 | rpm(选项)(参数) |
选项
1 | -a:查询所有套件; |
参数
软件包:指定要操纵的rpm软件包。
实例
如何安装rpm软件包
rpm软件包的安装可以使用程序rpm来完成。执行下面的命令:
1 | rpm -ivh your-package.rpm |
其中your-package.rpm是你要安装的rpm包的文件名,一般置于当前目录下。
安装过程中可能出现下面的警告或者提示:
1 | ... conflict with ... |
可能是要安装的包里有一些文件可能会覆盖现有的文件,缺省时这样的情况下是无法正确安装的可以用rpm --force -i
强制安装即可
1 | ... is needed by ... |
此包需要的一些软件你没有安装可以用rpm --nodeps -i
来忽略此信息,也就是说rpm -i --force --nodeps
可以忽略所有依赖关系和文件问题,什么包都能安装上,但这种强制安装的软件包不能保证完全发挥功能。
如何安装.src.rpm软件包
有些软件包是以.src.rpm结尾的,这类软件包是包含了源代码的rpm包,在安装时需要进行编译。这类软件包有两种安装方法:
方法一:
1 | rpm -i your-package.src.rpm |
方法二:
1 | rpm -i you-package.src.rpm |
前两步和方法一相同
1 | rpmbuild -bb your-package.specs #一个和你的软件包同名的specs文件 |
这时在/usr/src/redhat/RPM/i386/
(根据具体包的不同,也可能是i686,noarch等等)在这个目录下,有一个新的rpm包,这个是编译好的二进制文件。
执行rpm -i new-package.rpm
即可安装完成。
如何卸载rpm软件包
使用命令rpm -e
包名,包名可以包含版本号等信息,但是不可以有后缀.rpm,比如卸载软件包proftpd-1.2.8-1,可以使用下列格式:
1 | rpm -e proftpd-1.2.8-1 |
不可以是下列格式:
1 | rpm -e proftpd-1.2.8-1.i386.rpm |
有时会出现一些错误或者警告:
1 | ... is needed by ... |
这说明这个软件被其他软件需要,不能随便卸载,可以用rpm -e –nodeps强制卸载
如何不安装但是获取rpm包中的文件
1 | rpm2cpio xxx.rpm | cpio -vi |
参数i和extract相同,表示提取文件。v表示指示执行进程,d和make-directory相同,表示根据包中文件原来的路径建立目录,m表示保持文件的更新时间。
如何查看与rpm包相关的文件和其他信息
下面所有的例子都假设使用软件包mysql-3.23.54a-11
1、我的系统中安装了那些rpm软件包。
1 | rpm -qa 讲列出所有安装过的包 |
如果要查找所有安装过的包含某个字符串sql的软件包
1 | rpm -qa | grep sql |
2、如何获得某个软件包的文件全名。
1 | rpm -q mysql |
可以获得系统中安装的mysql软件包全名,从中可以获得当前软件包的版本等信息。这个例子中可以得到信息mysql-3.23.54a-11
3、一个rpm包中的文件安装到那里去了?
1 | rpm -ql 包名 |
注意这里的是不包括.rpm后缀的软件包的名称,也就是说只能用mysql或者mysql-3.23.54a-11而不是mysql-3.23.54a-11.rpm。如果只是想知道可执行程序放到那里去了,也可以用which,比如:
1 | which mysql |
4、一个rpm包中包含那些文件。
- 一个没有安装过的软件包,使用
rpm -qlp ****.rpm
- 一个已经安装过的软件包,还可以使用
rpm -ql ****.rpm
5、如何获取关于一个软件包的版本,用途等相关信息?
- 一个没有安装过的软件包,使用
rpm -qip ****.rpm
- 一个已经安装过的软件包,还可以使用
rpm -qi ****.rpm
6、某个程序是哪个软件包安装的,或者哪个软件包包含这个程序。
1 | rpm -qf `which 程序名` #返回软件包的全名 |
注意,这里不是引号,而是,就是键盘左上角的那个键。也可以使用
rpm -qilf`,同时输出软件包信息和文件列表。
7、某个文件是哪个软件包安装的,或者哪个软件包包含这个文件。
注意,前一个问题中的方法,只适用与可执行的程序,而下面的方法,不仅可以用于可执行程序,也可以用于普通的任何文件。前提是知道这个文件名。首先获得这个程序的完整路径,可以用whereis或者which,然后使用rpm -qf
例如:
1 | whereis ftptop |