xargs和文件打包和压缩

一.自己分析

1.xargs功能:它默认本身是读取键盘输入,读取输入之后把他显示

xargs
a b c <-键盘输入
a b c

1)从某种角度来讲,他和cat很像,但是xargs功能并不在cat这个效果上,他可以接收键盘的标准输出,然后把输入的结果传给xargs后续命令,来作为后续命令的参数。实际上刚才xargs后省略了一个echo,全部应该是 xargs echo ,实际上,现在键盘输入的东西都输入给了echo,而且他默认会把这个多个换行换掉,换成空格隔开。实际上,xargs的功能是这样的:读取键盘上的标准输入,然后把生成的这个标准输入的字符串传给echo,作为echo的参数,这是他的基本功能。

2)当然这个命令可以不用echo,可以换成别的,比如:xargs ls -l

[root@centos7 ~]# xargs  ls -l   
/etc/issue
/etc/passwd
-rw-r--r--. 1 root root  133 Jan  4 21:15 /etc/issue
-rw-r--r--. 1 root root 2284 Jan 11 18:16 /etc/passwd

键盘输入文件名,结束ctrl + d

把这些输入的内容,利用xargs传给了ls -l 作为其参数,也就是说xargs可以生成参数,那么只要支持参数的命令,参数是可以动态生成的,而不是写死的,从而增强了我们处理命令的功能。

3)综上,xargs的功能可以用一句话概括:用xargs可以把一些命令的参数动态生成.

 

 

2.

[root@centos7 ~]# ls f*| xargs rm 

显示所有f开头的文件,然后用xargs传给rm执行

 

 

3.当然你也可以指定几个一行

[root@centos7 ~]# echo {1..3} | xargs -n1
1
2
3
[root@centos7 ~]# echo {1..4} | xargs -n2
1 2
3 4

 

 

4.批量创建用户用xargs更方便(面试)

[root@centos7 ~]# echo user{1..10} | xargs -n1 useradd
[root@centos7 ~]# getent passwd
user1:x:1001:1001::/home/user1:/bin/bash
user2:x:1002:1002::/home/user2:/bin/bash
user3:x:1003:1003::/home/user3:/bin/bash
user4:x:1004:1004::/home/user4:/bin/bash
user5:x:1005:1005::/home/user5:/bin/bash
user6:x:1006:1006::/home/user6:/bin/bash
user7:x:1007:1007::/home/user7:/bin/bash
user8:x:1008:1008::/home/user8:/bin/bash
user9:x:1009:1009::/home/user9:/bin/bash
user10:x:1010:1010::/home/user10:/bin/bash
#注意:不能直接传给useradd做参数,因为useradd一次只能处理一个用户名,所以加-n1
#删除:
[root@centos7 ~]# echo user{1..10} | xargs -n1 userdel -r

 

 

5.

[root@centos7 ~]# find /bin/ -perm /7000 | xargs ls -Sl
-rwsr-xr-x. 1 root root    2447304 Apr  1  2020 /bin/Xorg
-rwxr-sr-x. 1 root screen   475240 Oct  1  2020 /bin/screen
---x--s--x. 1 root nobody   382216 Aug  9  2019 /bin/ssh-agent
---s--x---. 1 root stapusr  212080 Oct 14  2020 /bin/staprun
---s--x--x. 1 root root     147336 Oct  1  2020 /bin/sudo
-rwsr-xr-x. 1 root root      78408 Aug  9  2019 /bin/gpasswd
-rwsr-xr-x. 1 root root      73888 Aug  9  2019 /bin/chage
-rwsr-xr-x. 1 root root      57656 Aug  9  2019 /bin/crontab
-rwsr-xr-x. 1 root root      53048 Oct 31  2018 /bin/at
-rwsr-xr-x. 1 root root      44264 Oct  1  2020 /bin/mount
-rwsr-xr-x. 1 root root      41936 Aug  9  2019 /bin/newgrp
-rwx--s--x. 1 root slocate   40520 Apr 11  2018 /bin/locate
-rwsr-xr-x. 1 root root      32128 Oct  1  2020 /bin/su
-rwsr-xr-x. 1 root root      32096 Oct 31  2018 /bin/fusermount
-rwsr-xr-x. 1 root root      31984 Oct  1  2020 /bin/umount
-rwsr-xr-x. 1 root root      27856 Apr  1  2020 /bin/passwd
-rws--x--x. 1 root root      23968 Oct  1  2020 /bin/chfn
-rws--x--x. 1 root root      23880 Oct  1  2020 /bin/chsh
-rwsr-xr-x. 1 root root      23576 Apr  1  2020 /bin/pkexec
-rwxr-sr-x. 1 root tty       19544 Oct  1  2020 /bin/write
-r-xr-sr-x. 1 root tty       15344 Jun 10  2014 /bin/wall

这个7表示的是所有特殊权限,所有这里的意思是只要有suid、sgid或stoik权限都行

 

 

6.

[root@centos7 ~]# touch 'a b'
[root@centos7 ~]# ls 'a b'
a b
[root@centos7 ~]# find -type f | xargs rm
rm: cannot remove ‘./a’: No such file or directory
rm: cannot remove ‘b’: No such file or directory

发现报错了,因为他并不认为‘a b’是一个文件,而是认为a是一个文件,b是一个文件,所以就报错了。为什么他会出现这个原因?就是因为,默认情况下,他会认为'a b'中的这个空格是切割文件的切割符,但是现在恰恰不行。因为'a b'是一个文件,那为了告知系统,'a b'中的空格不做切割文件的分隔符,那我就要指定另一个切割文件的分隔符,用ASCII中的0.

[root@centos7 ~]# find -type f -print0 | xargs -0 rm

 

 

7.下载哔哩哔哩视频

yum install python3-pip -y
pip3 install you-get
seq 60 | xargs -i -P3 you get https://www.bilibili.com/video/BV14K411W7UF/?spm_id_from=333.788.recommend_more_video.{}

 

 

 

8.gzip.bzip2、xz都只能压单个文件,所以并不常用,而zip可以压文件夹,常用

 

 

9.xz、gzip也好,本身这些工具默认下不去处理文件夹,只能打包一个文件,那怎么办哪,没关系,我们用tar,用tar先把他打包成一个tar包,可以把文件夹打成一个tar包,然后再把它压缩成gz不就行了。

 

 

10.1)将etc打包到etc.tar文件中

[root@centos7 data]# tar cf etc.tar /etc/
tar: Removing leading `/' from member names
[root@centos7 data]# ls etc.tar
etc.tar

注意:这里只是打包不压缩

2)如果你想压缩:

[root@centos7 data]# tar zcf etc.tar.gz /etc/
tar: Removing leading `/' from member names
[root@centos7 data]# tar jcf etc.tar.bz2 /etc/
tar: Removing leading `/' from member names
[root@centos7 data]# tar Jcf etc.tar.xz /etc/ 
tar: Removing leading `/' from member names
[root@centos7 data]# ls
etc.tar  etc.tar.bz2  etc.tar.gz  etc.tar.xz

压缩比越高越慢

 

 

11.tar预览

tar tf etc.tar

预览里面包括什么文件

tar tvf etc.tar 

看到每个文件的大小属性

 

 

12.解开tar

1)解的话,默认解到当前路径下:

tar xvf etc.tar

2)我们也可以解到别的路径下:

[root@centos7 data]# tar xvf etc.tar -C /opt
[root@centos7 opt]# ls -d etc
etc

解到opt下

 

 

13.所以tar命令看起来复杂,实际上只用掌握三个:cf tf xf.

 

 

14.1) gzip支持管道,可以把一个命令执行结果传到gzip中生成一个文件

[root@centos7 data]# echo message | gzip > m.gz 
[root@centos7 data]# ls m.gz
m.gz

2)tar也支持管道

 

 

15.split切割

1)

split -b 100k -d etc.tar

这个地方加-d表示切出的文件自动加数字

2)当然如果不加-d,切出的则是aa、ab、ac...

 

 

二.相关资料

1.参数替换 xargs

由于很多命令不支持管道|来传递参数,xargs用于产生某个命令的参数,xargs 可以读入 stdin 的数 据,并且以空格符或回车符将 stdin 的数据分隔成为参数

另外,许多命令不能接受过多参数,命令执行可能会失败,xargs 可以解决

注意:文件名或者是其他意义的名词内含有空格符的情况

find 经常和 xargs 命令进行组合,形式如下:

find | xargs COMMAND

2.compress 和 uncompress

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

对应的文件是 .Z 后缀

格式

compress Options [file ...]
uncompress file.Z #解压缩

常用选项

-d 解压缩,相当于uncompress
-c 结果输出至标准输出,不删除原文件
-v 显示详情

zcat file.Z 不显式解压缩的前提下查看文本文件内容

范例:

zcat file.Z >file

3.gzip和gunzip

来自于 gzip 包

对应的文件是 .gz 后缀

格式:

gzip [OPTION]... FILE ...

常用选项:

-k keep, 保留原文件,CentOS 8 新特性
-d 解压缩,相当于gunzip
-c 结果输出至标准输出,保留原文件不改变
-# 指定压缩比,#取值为1-9,值越大压缩比越大

4.bzip2和bunzip2

来自于 bzip2 包

对应的文件是 .bz2 后缀

格式:

bzip2 [OPTION]... FILE ...

常用选项

-k keep, 保留原文件
-d 解压缩
-c 结果输出至标准输出,保留原文件不改变
-# 1-9,压缩比,默认为9

5.xz 和 unxz

来自于 xz 包

对应的文件是 .xz 后缀

格式

xz [OPTION]... FILE ...

常用选项

-k keep, 保留原文件
-d 解压缩
-c 结果输出至标准输出,保留原文件不改变
-# 压缩比,取值1-9,默认为6

6.zip 和 unzip

zip 可以实现打包目录和多个文件成一个文件并压缩,但可能会丢失文件属性信息,如:所有者和组信 息,一般建议使用 tar 代替

分别来自于 zip 和 unzip 包

对应的文件是 .zip 后缀

范例: zip帮助

[root@centos8 ~]#zip
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
Zip 3.0 (July 5th 2008). Usage:
zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
 The default action is to add or replace zipfile entries from list, which
 can include the special name - to compress standard input.
 If zipfile and list are omitted, zip compresses stdin to stdout.
  -f   freshen: only changed files  -u   update: only changed or new files
  -d   delete entries in zipfile    -m   move into zipfile (delete OS files)
  -r   recurse into directories     -j   junk (don't record) directory names
  -0   store only                   -l   convert LF to CR LF (-ll CR LF to LF)
  -1   compress faster              -9   compress better
  -q   quiet operation              -v   verbose operation/print version info
  -c   add one-line comments        -z   add zipfile comment
  -@   read names from stdin        -o   make zipfile as old as latest entry
  -x   exclude the following names  -i   include only the following names
  -F   fix zipfile (-FF try harder) -D   do not add directory entries
  -A   adjust self-extracting exe   -J   junk zipfile prefix (unzipsfx)
  -T   test zipfile integrity       -X   eXclude eXtra file attributes
  -y   store symbolic links as the link instead of the referenced file
  -e   encrypt                      -n   don't compress these suffixes
  -h2 show more help
  
[root@centos8 ~]#zip -h2
Extended Help for Zip
See the Zip Manual for more detailed help
Zip stores files in zip archives. The default action is to add or replace
zipfile entries.
Basic command line:
 zip options archive_name file file ...
Some examples:
 Add file.txt to z.zip (create z if needed):     zip z file.txt
 Zip all files in current dir:                   zip z *
 Zip files in current dir and subdirs also:       zip -r z .

7.tar

tar 即 Tape ARchive 磁带归档,可以对目录和多个文件打包一个文件,并且可以压缩,保留文件属性不 丢失,常用于备份功能,推荐使用

对应的文件是 .tar 后缀

格式

tar [-ABcdgGhiklmMoOpPrRsStuUvwWxzZ][-b <区块数目>][-C <目的目录>][-f <备份文件>][-F
<Script文件>][-K <文件>][-L <媒体容量>][-N <日期时间>][-T <范本文件>][-V <卷册名称>][-X
<范本文件>][-<设备编号><存储密度>][--after-date=<日期时间>][--atime-preserve][--
backuup=<备份方式>][--checkpoint][--concatenate][--confirmation][--delete][--
exclude=<范本样式>][--force-local][--group=<群组名称>][--help][--ignore-failedread][--new-volume-script=<Script文件>][--newer-mtime][--no-recursion][--null][--
numeric-owner][--owner=<用户名称>][--posix][--erve][--preserve-order][--preservepermissions][--record-size=<区块数目>][--recursive-unlink][--remove-files][--rshcommand=<执行指令>][--same-owner][--suffix=<备份字尾字符串>][--totals][--usecompress-program=<执行指令>][--version][--volno-file=<编号文件>][文件或目录...]

选项:

-A或--catenate 新增文件到已存在的备份文件。
-b<区块数目>或--blocking-factor=<区块数目> 设置每笔记录的区块数目,每个区块大小为12Bytes。
-B或--read-full-records 读取数据时重设区块大小。
-c或--create 建立新的备份文件。
-C<目的目录>或--directory=<目的目录> 切换到指定的目录。
-d或--diff或--compare 对比备份文件内和文件系统上的文件的差异。
-f<备份文件>或--file=<备份文件> 指定备份文件。
-F<Script文件>或--info-script=<Script文件> 每次更换磁带时,就执行指定的Script文件。
-g或--listed-incremental 处理GNU格式的大量备份。
-G或--incremental 处理旧的GNU格式的大量备份。
-h或--dereference 不建立符号连接,直接复制该连接所指向的原始文件。
-i或--ignore-zeros 忽略备份文件中的0 Byte区块,也就是EOF。
-k或--keep-old-files 解开备份文件时,不覆盖已有的文件。
-K<文件>或--starting-file=<文件> 从指定的文件开始还原。
-l或--one-file-system 复制的文件或目录存放的文件系统,必须与tar指令执行时所处的文件系统相
同,否则不予复制。
-L<媒体容量>或-tape-length=<媒体容量> 设置存放每体的容量,单位以1024 Bytes计算。
-m或--modification-time 还原文件时,不变更文件的更改时间。
-M或--multi-volume 在建立,还原备份文件或列出其中的内容时,采用多卷册模式。
-N<日期格式>或--newer=<日期时间> 只将较指定日期更新的文件保存到备份文件里。
-o或--old-archive或--portability 将资料写入备份文件时使用V7格式。
-O或--stdout 把从备份文件里还原的文件输出到标准输出设备。
-p或--same-permissions 用原来的文件权限还原文件。
-P或--absolute-names 文件名使用绝对名称,不移除文件名称前的"/"号。
-r或--append 新增文件到已存在的备份文件的结尾部分。
-R或--block-number 列出每个信息在备份文件中的区块编号。
-s或--same-order 还原文件的顺序和备份文件内的存放顺序相同。
-S或--sparse 倘若一个文件内含大量的连续0字节,则将此文件存成稀疏文件。
-t或--list 列出备份文件的内容。
-T<范本文件>或--files-from=<范本文件> 指定范本文件,其内含有一个或多个范本样式,让tar解开或
建立符合设置条件的文件。
-u或--update 仅置换较备份文件内的文件更新的文件。
-U或--unlink-first 解开压缩文件还原文件之前,先解除文件的连接。
-v或--verbose 显示指令执行过程。
-V<卷册名称>或--label=<卷册名称> 建立使用指定的卷册名称的备份文件。
-w或--interactive 遭遇问题时先询问用户。
-W或--verify 写入备份文件后,确认文件正确无误。
-x或--extract或--get 从备份文件中还原文件。
-X<范本文件>或--exclude-from=<范本文件> 指定范本文件,其内含有一个或多个范本样式,让ar排除
符合设置条件的文件。
-z或--gzip或--ungzip 通过gzip指令处理备份文件。
-Z或--compress或--uncompress 通过compress指令处理备份文件。
-<设备编号><存储密度> 设置备份用的外围设备编号及存放数据的密度。
--after-date=<日期时间> 此参数的效果和指定"-N"参数相同。
--atime-preserve 不变更文件的存取时间。
--backup=<备份方式>或--backup 移除文件前先进行备份。
--checkpoint 读取备份文件时列出目录名称。
--concatenate 此参数的效果和指定"-A"参数相同。
--confirmation 此参数的效果和指定"-w"参数相同。
--delete 从备份文件中删除指定的文件。
--exclude=<范本样式> 排除符合范本样式的文件。
--group=<群组名称> 把加入设备文件中的文件的所属群组设成指定的群组。
--help 在线帮助。
--ignore-failed-read 忽略数据读取错误,不中断程序的执行。
--new-volume-script=<Script文件> 此参数的效果和指定"-F"参数相同。
--newer-mtime 只保存更改过的文件。
--no-recursion 不做递归处理,也就是指定目录下的所有文件及子目录不予处理。
--null 从null设备读取文件名称。
--numeric-owner 以用户识别码及群组识别码取代用户名称和群组名称。
--owner=<用户名称> 把加入备份文件中的文件的拥有者设成指定的用户。
--posix 将数据写入备份文件时使用POSIX格式。
--preserve 此参数的效果和指定"-ps"参数相同。
--preserve-order 此参数的效果和指定"-A"参数相同。
--preserve-permissions 此参数的效果和指定"-p"参数相同。
--record-size=<区块数目> 此参数的效果和指定"-b"参数相同。
--recursive-unlink 解开压缩文件还原目录之前,先解除整个目录下所有文件的连接。
--remove-files 文件加入备份文件后,就将其删除。
--rsh-command=<执行指令> 设置要在远端主机上执行的指令,以取代rsh指令。
--same-owner 尝试以相同的文件拥有者还原文件。
--suffix=<备份字尾字符串> 移除文件前先行备份。
--totals 备份文件建立后,列出文件大小。
--use-compress-program=<执行指令> 通过指定的指令处理备份文件。
--version 显示版本信息。
--volno-file=<编号文件> 使用指定文件内的编号取代预设的卷册编号

(1) 创建归档,保留权限

tar -cpvf /PATH/FILE.tar FILE...

(2) 追加文件至归档: 注:不支持对压缩文件追加

tar -rf /PATH/FILE.tar FILE...

(3) 查看归档文件中的文件列表

tar -t -f /PATH/FILE.tar

(4) 展开归档

tar xf /PATH/FILE.tar
tar xf /PATH/FILE.tar -C /PATH/

(5) 结合压缩工具实现:归档并压缩

-z 相当于gzip压缩工具
-j 相当于bzip2压缩工具
-J 相当于xz压缩工具

--exclude 排除文件

范例:

tar zcvf /root/a.tgz  --exclude=/app/host1 --exclude=/app/host2 /app
-T 选项指定输入文件
-X 选项指定包含要排除的文件列表

8.split

split 命令可以分割一个文件为多个文件

范例:

#分割大的 tar 文件为多份小文件
split -b Size –d tar-file-name prefix-name
示例:
split -b 1M mybackup.tgz mybackup-parts
#切换成的多个小分文件使用数字后缀
split -b 1M –d mybackup.tgz mybackup-parts

将多个切割的小文件合并成一个大文件

cat mybackup-parts* > mybackup.tar.gz

9.cpio

cpio 是历史悠久的打包和解包工具,不过目前也已较少使用

cpio 命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以“.cpio”或者“.tar” 结尾的文件

格式:

cpio [选项] > 文件名或者设备名
cpio [选项] < 文件名或者设备名

常用选项

-o   output模式,打包,将标准输入传入的文件名打包后发送到标准输出
-i input模式,解包,对标准输入传入的打包文件名解包到当前目录
-t 预览,查看标准输入传入的打包文件中包含的文件列表
-O filename 输出到指定的归档文件名
-A 向已存在的归档文件中追加文件
-I filename 对指定的归档文件名解压
-F filename 使用指定的文件名替代标准输入或输出
-d 解包生成目录,在cpio还原时,自动的建立目录
-v 显示打包过程中的文件名称

范例:

#将etc目录备份
find ./etc -print | cpio -ov > bak.cpio
#将/data内容追加bak.cpio
find /data | cpio -oA -F bak.cpio
#内容预览
cpio –tv < etc.cpio
#解包文件
cpio –idv < etc.cpio 

 

 

 

2022-2-3 22:22

上一篇:HTTP请求中返回文件


下一篇:Linux之find xargs