[Linux Shell学习系列四]Shell命令进阶-文件处理和归档

D10

1. paste命令

paste命令用于合并文件的行。可以合并一个或多个文件中的行。

语法:paste [OPTION]... [FILE]...

$ cat a.txt #源文件1
Linux
Unix
Windows
$ cat b.txt #源文件2
Dell
IBM
HP
$ cat c.txt #源文件3
1
2
3

$ paste a.txt b.txt #默认将各文件中的各行以制表符作为分隔符合并并输出
Linux   Dell
Unix    IBM
Windows HP

$ paste a.txt b.txt c.txt #可以合并多个文件
Linux   Dell    1
Unix    IBM     2
Windows HP      3

$ paste -d'|' a.txt b.txt #使用-d选项,指定合并时使用的分隔符
Linux|Dell
Unix|IBM
Windows|HP

$ paste -d',:' a.txt b.txt c.txt #使用-d选项,多个文件合并,可以指定多个分隔符
Linux,Dell:1
Unix,IBM:2
Windows,HP:3

$ paste -s a.txt b.txt #使用-s选项,可以顺序的将每个文件中的所有内容合并为一行
Linux   Unix    Windows
Dell    IBM     HP

$ paste  -d, -s a.txt #使用-s和-d选项,指定合并行的分隔符
Linux,Unix,Windows

$ paste - - < a.txt #将文件的内容从一列转为两列
Linux   Unix
Windows

$ paste -d : - - < a.txt #将文件的内容从一列转为两列,并使用分隔符
Linux:Unix
Windows:

$ paste - - - < a.txt #将文件的内容从一列转为三列
Linux   Unix    Windows

 

2. dd命令

dd命令可以通过可能的转换格式赋值指定的输入文件到指定的输出,可以指定输入和输出的块大小(默认字节),以处理原始物理数据的读写。功能很强大。

语法:dd if=<inputfile> of=<outputfile> [bs=<n>] [count=<n>]

# dd if=/dev/sda of=/dev/sdb #复制一个磁盘/dev/sda的数据到另一个磁盘/dev/sdb

# dd if=/dev/dvd of=dvd.iso #复制一个DVD光盘的数据到一个iso文件

# dd if=/dev/zero of=/dev/sda2 #擦除一个分区/dev/sda2的数据,/dev/zero是一个特殊文件,从中读取的内容都是空字符,它的一个典型用途就是提供用于初始化数据存储器的字符流

# dd if=/dev/zero of=/tmp/outfile bs=1024 count=1024 #创建一个1MB大小的文件,并且块大小为1024个字节

# dd if=/dev/sda of=/home/user1/MBR.image bs=512 count=1 #备份磁盘的主引导分区

#下面命令的组合可以用于设备的标准测试,并分析其在块大小为1024字节时的顺序读写的性能
# dd if=/dev/zero bs=1024 count=1000000 of=/home/user1/1Gb.file 
# dd if=/home/user1/1Gb.file of=/dev/null bs=64k #/dev/null是一个特殊文件,可以接受所有向它写入的数据,但读不出任何数据。所有想过滤掉的输出数据都可以重定向到这个文件

注:上述命令没有尝试

 

3. gzip、bzip2命令

gzip命令用于压缩文件,以减少文件的大小,便于传输,也可以用于解压缩文件。文件压缩所能减少的大小依赖于文件内容,如果是文本文件,用gzip压缩约减少60%~70%。

$ ls   #查看目录下的文件
a.txt  b.txt  c.txt
$ gzip a.txt #压缩指定的问题,生成默认以.gz结尾的文件并删除原始文件
$ ls #查看
a.txt.gz  b.txt  c.txt

$ gzip -d a.txt.gz #使用-d选项解压缩指定的文件
$ ls   
a.txt  b.txt  c.txt

$ gzip -c a.txt > a.txt.gz #使用-c选项,将压缩内容输出到标准输出,可使用重定向将输出内容写入到指定的文件,从而保留原始文件
$ ls
a.txt  a.txt.gz  b.txt  c.txt

$ gzip -r . #使用-r选项,递归地压缩指定目录下的文件
gzip: ./a.txt.gz already exists; do you wish to overwrite (y or n)? y
$ ls
a.txt.gz  b.txt.gz  c.txt.gz

$ gzip -rd . -h #使用-r和-d选项,递归地解压缩指定目录下的文件
$ ls
a.txt  b.txt  c.txt

$ gzip -1 a.txt #使用-#选项(#代表数字1~9),可指定gzip的压缩级别,-1表示最快速度但压缩率较低,-9表示最慢压缩速度但压缩率最好。默认级别是-6

 

bzip2命令也用于压缩和解压缩文件。与gzip相比,bzip2具有更好的压缩率,但速度稍慢。

$ ls #查看目录下的文件
a.txt  b.txt  c.txt

$ bzip2 a.txt #压缩指定文件,生成一个默认以.bz2结尾的文件,并删除原始文件
$ ls
a.txt.bz2  b.txt  c.txt

$ bzip2 -d a.txt.bz2 #解压缩指定文件
$ ls 
a.txt  b.txt  c.txt

$ bzip2 -k a.txt #使用-k选项,压缩文件并保留原始文件
$ ls
a.txt  a.txt.bz2  b.txt  c.txt

$ bzip2 -df a.txt.bz2 #使用-f选项,覆盖已经存在的文件
$ ls
a.txt  b.txt  c.txt

$ bzip2 -6 a.txt #使用-#选项(#代表1~9)指定压缩级别,默认采用-9

 

4. gunzip、bunzip2命令

gunzip命令与gzip命令相对应,用于解压缩由gzip命令压缩的文件。作用与gzip -d选项相同。

$ ls #查看目录
a.txt.gz  b.txt  c.txt

$ gunzip a.txt.gz  #解压缩指定文件
$ ls
a.txt  b.txt  c.txt

$ gunzip -c a.txt.gz > a.txt #使用-c选项,将解压后的内容重定向到一个文件,以保留原始压缩文件
$ ls
a.txt  a.txt.gz  b.txt  c.txt

 

bunzip2命令与bzip2命令相对应,用于解压缩由bzip2命令压缩的文件。起作用与bzip2 -d选项相同。

$ ls #查看目录
a.txt.bz2  b.txt  c.txt

$ bunzip2 a.txt.bz2  #解压缩指定文件
$ ls
a.txt  b.txt  c.txt

$ bunzip2 -k a.txt.bz2 #使用-k选项,解压缩文件并保留原始文件
$ ls
a.txt  a.txt.bz2  b.txt  c.txt

 

5. tar命令

tar命令是Linux系统中主要的归档工具。使用tar命令归档后生成的文件被称作tar包。

语法:tar [OPTION]... [FILE]...

$ tar -cvf test.tar test/ #创建一个未经压缩的tar包,-c:创建一个新的归档,-v:冗长地列出被处理的文件,-f:指定归档文件的名称
test/
test/a.txt
test/b.txt
test/c.txt
$ ls
test  test.tar

$ tar -czvf test.tar.gz test/ #结合-z选项,将归档后的文件使用gzip压缩
test/
test/a.txt
test/b.txt
test/c.txt
$ ls
test  test.tar  test.tar.gz

$ tar -cjvf test.tar.bz2 test/ #结合-j选项,将归档后的文件使用bzip2压缩
test/
test/a.txt
test/b.txt
test/c.txt
$ ls
test  test.tar  test.tar.bz2  test.tar.gz

$ tar -xvf test.tar #使用-xvf选项,解压缩一个归档文件
test/
test/a.txt
test/b.txt
test/c.txt

$ tar -xvf test.tar test/a.txt #使用-xvf选项,从tar包中提取指定的文件或目录
test/a.txt
$ ls
test  test.tar  test.tar.bz2  test.tar.gz
$ ls test
a.txt #注意只提取出指定的文件

$ tar -xvf test.tar --wildcards '*.txt' #使用--wildcards配合-xvf选项,可以提取匹配指定模式的一组文件或目录
test/a.txt
test/b.txt
test/c.txt

$ ls #查看目录
test.tar  test.tar.bz2  test.tar.gz

$ tar -xzvf test.tar.gz #结合-z选项,解压缩使用gzip压缩的tar包
test/
test/a.txt
test/b.txt
test/c.txt
$ ls test
a.txt  b.txt  c.txt

$ tar -xzvf test.tar.gz test/a.txt #结合-z选项,从gzip压缩的tar包中提取指定文件或目录
test/a.txt
$ ls test
a.txt

$ tar -xjvf test.tar.bz2 #结合-j选项,解压缩使用bzip2压缩的tar包
test/
test/a.txt
test/b.txt
test/c.txt
$ ls test
a.txt  b.txt  c.txt

$ tar -xjvf test.tar.bz2 test/a.txt #结合-j选项,从bzip2压缩的tar包中提取指定文件或目录
test/a.txt
$ ls test
a.txt

$ tar -tvf test.tar #使用-tvf选项,在不解包的情况下列出tar包文件中的内容
drwxrwxr-x user1/user1     0 2020-05-15 10:21 test/
-rw-rw-r-- user1/user1    19 2020-05-15 10:15 test/a.txt
-rw-rw-r-- user1/user1    12 2020-05-15 09:36 test/b.txt
-rw-rw-r-- user1/user1     6 2020-05-15 09:36 test/c.txt

$ tar -tzvf test.tar.gz #使用-tvf选项结合-z选项,在不解包的情况下列出gzip压缩的tar包文件中的内容
drwxrwxr-x user1/user1     0 2020-05-15 10:21 test/
-rw-rw-r-- user1/user1    19 2020-05-15 10:15 test/a.txt
-rw-rw-r-- user1/user1    12 2020-05-15 09:36 test/b.txt
-rw-rw-r-- user1/user1     6 2020-05-15 09:36 test/c.txt

$ tar -tjvf test.tar.bz2 #使用-tvf选项结合-j选项,在不解包的情况下列出bzip2压缩的tar包文件中的内容
drwxrwxr-x user1/user1     0 2020-05-15 10:21 test/
-rw-rw-r-- user1/user1    19 2020-05-15 10:15 test/a.txt
-rw-rw-r-- user1/user1    12 2020-05-15 09:36 test/b.txt
-rw-rw-r-- user1/user1     6 2020-05-15 09:36 test/c.txt

$ tar -rvf test.tar d.txt #使用-rvf选项,可以添加文件或目录到一个已存在的tar包
d.txt
$ tar -tvf test.tar
drwxrwxr-x user1/user1     0 2020-05-15 10:21 test/
-rw-rw-r-- user1/user1    19 2020-05-15 10:15 test/a.txt
-rw-rw-r-- user1/user1    12 2020-05-15 09:36 test/b.txt
-rw-rw-r-- user1/user1     6 2020-05-15 09:36 test/c.txt
-rw-rw-r-- user1/user1    14 2020-05-15 10:36 d.txt

#注意不能将-r与-z、-j一同使用,即不能将文件或目录添加到一个压缩过的tar包,错误如:
$ tar -rzvf test.tar.gz d.txt 
tar: Cannot update compressed archives
Try `tar --help' or `tar --usage' for more information.

$ tar -cWvf test.tar test #使用-W选项,核实tar包的内容,注意不能使用-W核实压缩过的tar包的内容
test/
test/a.txt
test/b.txt
test/c.txt
Verify test/
Verify test/a.txt
Verify test/b.txt
Verify test/c.txt

$ tar -tWvf test.tar #可核实tar包文件中的内容与文件系统中的内容是否存在差异
#注:该命令执行错误如下,未解决
tar: This does not look like a tar archive
tar: Skipping to next header
Verify -rw-rw-r-- user1/user1     6 2020-05-15 09:36 test/c.txt
tar: Exiting with failure status due to previous errors

$ tar -dvf test.tar #使用-d选项也可以比较tar包中的内容与文件系统中的内容的差异,但不具有核实功能
test/
test/a.txt
test/b.txt
test/c.txt

$ tar -dvf test.tar.gz #使用-d选项也可以比较压缩后的tar包中的内容与文件系统中的内容的差异,但不具有核实功能
test/
test/a.txt
test/a.txt: Mod time differs #此处发现更新时间有差异
test/b.txt
test/c.txt

 本节结束

posted @ 2020-05-15 10:10  workingdiary  阅读(380)  评论(0)    收藏  举报