1. 文件查找—{find,locate}

1. 文件查找—{find,locate}

在文件系统上查找符合条件的文件

1.1. 文件查找:locate, find

  • 非实时查找(数据库查找):locate
  • 实时查找:find

2. locate

  • 查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db

  • 依赖于事先构建的索引
    索引的构建是在系统较为空闲时自动进行(周期性任务),管理员手动更新数据库

  • 手动更新数据库命令:updatedb

  • 索引构建过程需要遍历整个根文件系统,极消耗资源

  • 工作特点:

    • 查找速度快
    • 模糊查找 :只要包含有PATTREN,不论在文件路径全名的任何部分,都会显示出来(也就是默认选项-w,同时如果不使用标准正则表达式和通配符的时候,也就是locate后面的keyword直接就是一个精确的文件名比如f1.txt,而不包含任何通配符的符号)
    • 非实时查找
    • 搜索的是文件的全路径,不仅仅是文件名(默认-w)
    • 可能只搜索用户具备读取和执行权限的目录
  • 用法: locate [OPTION]... PATTERN...

  • 有用的选项

    -b 精确查找文件名,不查找包括文件路径内的字符(注意文件夹也是个文件) 此时分几种情况: 1. 使用-r(标准正则表达式)或--regex(扩展正则表达式)的时候 此时查找的文件只有文件名(-b选项控制),搜索匹配的文件名中只要包含有exp中的字符即可,不需要全部匹配,它不是精确匹配 2. 不使用-r或--regex选项,也不使用通配元字符,也就是直接就是只有普通的字符串(比如f1.txt) 此时查找的文件只有文件名 (-b选项控制),搜索匹配的文件名中只要包含pattern即可,并不是精确匹配; 此时locate会把pattern看做是*pattern*来看待,比如上面举例的f1.txt会看做 *f1.txt* 来进行搜索匹配,其中*就是通配符的代表任意长度任意字符 3. 不使用-r或--regex选项,但是使用通配符元字符(比如*,?,[],或\(转义) 等) 此时查找的文件只有文件名 (-b选项控制),同时搜索匹配的文件名必须是全精确匹配所写的包含通配符的pattern, 也就是说比如locate -b "\name",此时查找的文件就是文件名精确为name的文件,并不是文件名包含name的文件。 再比如说 locate -b "n?me",其结果也只会匹配为这4个字符,其中第二个字符为任意字符的文件名,而不是说包含这4个字符的文件名。 可以用这种方式精确查找一个文件名文件! -w 全路径查找文件,包括会在文件名的dirname中查找,和-b刚好相对应,locate默认就是这种模式 1.此时的前两种情况和上面所写的相同,就是匹配范围扩大了而已,不只是文件名,还包括文件路径 2.但是类似上面的第三种情况经测试好像无法使用了,无法匹配到结果(因为pattern必须加双引号,可能把pattern看做了字符串,其中的通配元字符并未进行扩展,但不加双引号又会变成filename expansion,所以这种情况好像不能用了) -i 不区分大小写的搜索 -n N 只列举前N个匹配项目 -r 使用**基本**的正则表达式 --regex 使用扩展的正则表达式
  • 示例

    1. 搜索名称或路径中带有“conf”的文件 locate conf 2. 使用Regex来搜索以“.conf”结尾的文件 locate -r ‘\.conf$’

2.0.1. locate注意点

  1. 重要注意点!:locate有一个特点,就是说如果不使用–regex选项(扩展的正则表达式),同时keyword也不使用通配符的任何符号(比如?,*,+,\(转义字符也是通配元字符)等等),则locate执行的时候表现的好像就是在匹配pattern一样;具体详情看上面的-b和-w选项参数
  2. locate是匹配的数据库而不是当前所在目录,它和find匹配需要指明查找目录不同;因此执行locate命令的时候不用在意当前所在目录
  3. locate pattern后面指定的pattern要加上引号,不然pattern里面的通配符(比如[],?,*等等这种通配符),就会被看做是filename expansion了,此时相当于locate 当前目录下符合filename expansion的所有文件这种方式进行搜索匹配了。
    • 由于locate支持一次性搜索匹配多个文件,所以不会报错,并且会把所有包含这些文件名的所有文件都匹配并显示出来。
    • 但是下面的find命令就会报错,因为它的语法结构不能让它用这种方式一次匹配多个文件(如果filename expansion扩展后只有一个文件不会报错,但是要清楚为何是这样)
    • 因此它俩搜索匹配使用通配符的时候都要加上双引号!最好养成什么情况下都加上引号的习惯
  4. locate查找的数据库因为不是实时更新的,因此使用它的时候最好提前用一下updatedb命令,可以定义别名alias locate='updatedb; locate -b',此时再用locate并且使用通配符的时候就是精确匹配文件名了,但别忘了需加上双引号,不然还是会进行filename expansion;

3. find

实时查找工具,通过遍历指定路径完成文件查找

  • 工作特点:

    • 查找速度略慢
    • 精确查找
    • 实时查找
    • 可能只搜索用户具备读取和执行权限的目录
  • 语法:
    find [OPTION]... [查找路径] [查找条件] [处理动作]

  • 查找路径:指定具体目标路径,默认为当前目录(默认就是递归搜索,并不像其他命令一样比如cp需要加-r选项)

  • 查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行,默认为找出指定路径下的所有文件

  • 处理动作:对符合条件的文件做操作,默认输出至屏幕

  • 注意了,man帮助中,find后面的expression是由Options,Tests,Action组成的,它们要按照这个顺序进行参数的书写,主要要分清options和tests都是哪些即可。

3.1. find命令注意点1:

  1. 注意当查找当前目录的时候,find显示的结果最前面不是完整路径名,而是以./开头的,如果用-regex参数的时候要注意
  2. find命令默认就递归文件夹目录了,不需要加-r,可以通过下面的最大最小深度的选项来改变默认的全部递归
  3. find -name的时候默认支持通配符,而locate查看帮助得知默认也是支持通配符,详细看man帮助和上面locate的解释
  4. find -name pattern匹配通配符时候,pattern要加上双引号(因为如果不加上双引号的话,会进行pathname expression,这样相当于find搜索多个文件,没有这种语法,locate命令也同样)
    • 同时注意此时find命令里面的*,?,[]通配元字符,支持匹配开头带一个.的隐藏文件了,这和默认的pathname expression不支持匹配以.开头的隐藏文件不同(比如ls *,cp *命令就不行)
  5. find -name pattern命令匹配文件名(不论使用不使用通配符,都是要和文件名完全精确匹配才可以)和locate默认的匹配规则不同,它就是精确匹配(类似相当于locate -b "\pattern",这里locate使用了统配符号\,具体看上面-b的解释),
    • 但是不论是locate还是find,使用通配符的时候一定要加上双引号,不然就会先filename expansion,和自己想要的结果不同

3.2. –find查找条件

3.2.1. 指搜索层级(options)

-maxdepth level 最大搜索目录深度,指定目录下的文件为第1级
-mindepth level 最小搜索目录深度
例子:find -maxdepth 1 只搜索当前目录

3.2.2. 先处理目录内的文件,再处理指定目录(options)

-depth
它的结果会先显示文件,最后再显示目录和里面的内容

  • 注意-delete命令默认开启-depth选项,所以如果想用-delete命令的时候,前期用find测试结果的时候要加上-depth选项避免结果不一致,然后删除的时候删错了!

3.2.3. 根据文件名和inode查找(tests):

```
-name "文件名称":**支持使用glob通配符**
	  *, ?, [], [^]
-iname "文件名称":不区分字母大小写
-inum n 按inode号查找
-samefile name 相同inode号的文件
-links n 链接数为n的文件
-regex “regular expression” - 此时EXP就必须是全匹配,因为它匹配的是文件名的整个路径,其中-regex的默认是emcs标准正则表达式,可以用-regextype选项修改
	  For example, to match a file named `./fubar3',
	  you can use the regular expression `.*bar.' or `.*b.*3', but not `f.*r3'.

```

3.2.4. 根据属主、属组查找:

-user USERNAME:查找属主为指定用户(UID)的文件 -group GRPNAME: 查找属组为指定组(GID)的文件 -uid UserID:查找属主为指定的UID号的文件 -gid GroupID:查找属组为指定的GID号的文件 -nouser:查找没有属主的文件 :删除了的用户创建的文件,下同 -nogroup:查找没有属组的文件

实例:

find . -user "zhang" -name "a*" find . -user root -ls

3.2.5. 根据文件类型查找

-type TYPE f: 普通文件 d: 目录文件 l: 符号链接文件 s:套接字文件 b: 块设备文件 c: 字符设备文件 p: 管道文件

3.2.6. 空文件或目录(大小为0)

-empty

  • 示例:find /app -type d -empty

3.2.7. 组合条件:

与:-a 默认 或:-o 非:-not 或 !

3.2.8. 德·摩根定律:

(非 A) 或 (非 B) = 非(A 且 B) (非 A) 且 (非 B) = 非(A 或 B)
  • 示例:
!A -a !B = !(A -o B) !A -o !B = !(A -a B)

3.2.9. 排除目录

  • 示例:
查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件 find /etc -path '/etc/sane.d' -a –prune -o -name “*.conf” 查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的所有.conf后缀的文件 find /etc \( -path "/etc/sane.d" -o -path "/etc/fonts" \) -a -prune -o -name "*.conf"
  • 注意上面-path参数后面的文件夹加单引号或者双引号都可以,但不能在目录后面多加一个/,不然结果相当于无效,仍然会搜索这些文件夹
  • 其中-a可以不用写,还有如果用-path选项,那么其后面的文件夹名称是针对find后面写的路径的相对路径来找的,只有前面也是绝对路径,-path后面再用绝对路径才有效,详细可以看man find帮助

3.2.9.1. find -path参数注意点:

  • 这里的主要原因就是,find命令的格式是 find 路径起始点 EXP这种,而这个路径起始点,如果不写,则在结果中默认就是.,代表当前路径,写绝对路径则结果最开头也是绝对路径,写相对路径结果最开头也是相对路径,比如下面举例:
    # cd /data # find | head . ./test ./test/atest ./test/atest/a2 ./test/atest/a2/b1 ./test/atest/a2/b1/a1 ./test/atest/a2/b1/a2 ./test/atest/a2/b1/a3 ./test/atest/a2/b1/a4 ./test/atest/a2/b1/a5 # find . | head . ./test ./test/atest ./test/atest/a2 ./test/atest/a2/b1 ./test/atest/a2/b1/a1 ./test/atest/a2/b1/a2 ./test/atest/a2/b1/a3 ./test/atest/a2/b1/a4 ./test/atest/a2/b1/a5 # find /data | head /data /data/test /data/test/atest /data/test/atest/a2 /data/test/atest/a2/b1 /data/test/atest/a2/b1/a1 /data/test/atest/a2/b1/a2 /data/test/atest/a2/b1/a3 /data/test/atest/a2/b1/a4 /data/test/atest/a2/b1/a5 # find ../data/test | head ../data/test ../data/test/atest ../data/test/atest/a2 ../data/test/atest/a2/b1 ../data/test/atest/a2/b1/a1 ../data/test/atest/a2/b1/a2 ../data/test/atest/a2/b1/a3 ../data/test/atest/a2/b1/a4 ../data/test/atest/a2/b1/a5 ../data/test/atest/a2/b1/b1 -------------------------------------------------- 这里前面四个搜索显示的结果都是相同的,但是由于起始点写的不同,所以结果显示的就不同!
  • 同时,-path pattern中的pattern就是文件夹的名字,它支持通配符的格式,但要注意,它匹配的是整个文件夹名(而不是单单的文件夹名),同时它是从find 搜索路径起始点来开始匹配的,也就是说,根据上面的测试结果也可知,这个-path pattern中的pattern所写的形式一定要和搜索路径起始点相互对应才可以!
  • find 搜索路径起始点 -path pattern
    • 它相当于是先直接执行find 搜索路径起始点**命令,不加任何参数,这样会打印出一个搜索的结果,然后再在这个搜索的结果中,再搜索pattern所对应的项目
    • 同时要注意这里pattern匹配的时候必须要匹配这整个文件名包括它的路径(也就是要和这个搜索的结果完全一致的项才能被匹配到,而并非是只匹配最后的文件夹的名字)
    • 注意-path匹配的是整个文件名包括路径,这里-path并不是说只匹配文件夹,文件名同样也匹配;
    • 同时从搜索的结果 中也可知道,不论是普通文件还是文件夹(目录), 搜索的结果 文件(夹)名最后面不会有/斜杠的符号,所以在pattern中写文件(夹)名的时候,最后面也不能加上/符号,否则什么也匹配不到
  • -path里面不会把./特殊看待(本来这两个符号也不属于pattern通配符,这里只是随口说一下),它俩就会被看做普通符号。
  • 这就是-path的所有解释
  • 比如举例:
    在当前目录匹配test文件(夹): find . -path "./test" - 而不能写为 find . -path "/data/test" (前后起始点不对应,无法匹配到结果) - 也不能写成 find . -path "./test/" (最后面加/也是无法匹配到这种文件(夹)名) 当写为通配符形式,比如: find . -path "./*te?t" 此时,就会在上面搜索的结果中匹配任何和这个pattern完全符合的文件名,包括下一级子目录内的文件夹名和普通文件名,比如 # find . -path "./*te?t" ./test ./test/atest ./test/a1/test ./test/vim.test ./scripttest 其中 vim.test 是普通文件,其他的都是目录名 由这个例子也可证明上面所写的匹配过程

3.2.10. 根据文件大小来查找:

-size [+|-]#UNIT 其中#代表数字,UNIT代表单位; 常用单位UNIT:k, M, G,c(byte) #UNIT: (#-1, #] 如:6k 表示(5k,6k] -#UNIT:[0,#-1] 如:-6k 表示[0,5k] +#UNIT:(#,∞) 如:+6k 表示(6k,∞)

3.2.11. 根据时间戳:

以“天”为单位,注意天数是往前倒着算的,当前为0天 -atime [+|-]#, #: [#,#+1) +#: [#+1,∞] -#: [0,#) -mtime -ctime 以“分钟”为单位 -amin -mmin -cmin

文件查找和压缩插图


3.2.12. 根据权限查找:

-perm [/|-]MODE MODE: 精确权限匹配,注意如果此时用象征表达法(u=rwx等等),必须要全部写全,如果只写一部分,比如只写了u=rw,则相当于匹配0200的权限; /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配所写的MODE即可(其中0表示此位不关心),或关系,+从centos7开始淘汰 -MODE:每一类对象(属主,属组和其他)都至少同时拥有指定的权限,它们之间是与关系;此时每一类的权限可以更多,但是不能更少(比如MODE中0642;不仅可以匹配0642的,还可以匹配,0666,0777的等等比它权限更多的) 上面的两个MODE中0表示不关注相对应的属主,属组,或者其它人 举例说明: find -perm 755 会匹配权限模式恰好是755的文件 只要当任意人有写权限时,find -perm +222就会匹配 只有当每个人都有写权限时,find -perm -222才会匹配 只有当其它人(other)有写权限时,find -perm -002才会匹配
  • 注意:当三位中只有一个位上有数值,另两位都为0时,/和-并无区别,因为另外两位不关注了(特殊权限也可以查询,严格点应该有4位)
  • 但是注意,如果没有/或者-的前缀符号,此时就是表示精确匹配权限,这种情况下,0就是代表没有权限,不是不关注的意思,需要区分

3.3. find查找条件注意点2:

  1. find当使用-regex参数时,以PATTERN(标准正则表达式)匹配整个文件(夹)路径,而非单单只是文件的名称。如果只有包含这个pattern的文件路径,并不能识别,必须要整个路径全部匹配才可,因此注意要多加.*,详细的上面已经说明。
    • 由此可见-regex有点类似 -path参数的过程,只不过一个pattern是正则表达式,一个是通配符
    • 同时注意,如果-name 文件名 的方式,也要多加通配符*因为它虽然只匹配文件名字,但它也是精确匹配,必须要全部匹配到精确的名字,只不过和比正则表达式模式的区别就是是它不需要全路径,只需要文件名即可。
  2. locate只有不使用正则表达式且使用通配符号,同时添加-b参数的时候,才是精确匹配,其他情况都是只需要包含匹配即可,上面也已经说明.
  3. 注意find里面的小括号要转义
  4. 注意find命令前面的三个选项-P -L 和-H
    • -L选项,表示总是follow软链接(文件夹)的连接目标文件,此选项可以找到所有的文件
    • -H选项,则只会把命令行所写的参数(比如起始查找地址)的软链接进行follow查找,而不会再对查找结果中的软链接进行follow
    • -P选项,默认的,不对任何软链接进行follow 举例说明:
    /lib是个软连接文件,它内部也有软链接的文件夹,对它进行测试再合适不过了 默认的,如果不加选项则不follow软链接,只找到一个结果 # find /lib /lib # find /lib |wc -l 1 # find -H /lib |wc -l 11744 # find -L /lib |wc -l 12597 # find /lib/ |wc -l 11744 这里面可见-H和-L的区别,其中在查找的地址后面加上/则和使用-H选项是相同的效果

3.3.1. find简单示例1

find -name snow.png find -iname snow.png find / -name “*.txt” find /var –name “\*log\*” find -user joe -group joe find -user joe -not -group joe find -user joe -o -user jane 找出当前目录下属主既不是joe也不是jane的文件 find -not \( -user joe -o -user jane \) find / -user joe -o -uid 500 找出/tmp目录下,属主不是root,且文件名不以f开头的文件 find /tmp \( -not -user root -a -not -name 'f*' \) -ls find /tmp -not \( -user root -o -name 'f*' \) –ls

3.4. –find处理动作

-print:默认的处理动作,显示至屏幕 -ls:类似于对查找到的文件执行“ls -l” 命令 -delete:删除查找到的文件 -fls file:查找到的所有文件的长格式信息保存至指定文件中,file写的是文件名,可以不存在它会自己创建一个 -ok COMMAND '{}' \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认 -exec COMMAND '{}' \; 对查找到的每个文件执行由COMMAND指定的命令,无需交互式确认 {}: 用于引用查找到的文件名称自身 - find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令

3.4.1. find示例2

  1. 备份配置文件,添加.orig这个扩展名
    find -name “*.conf” -exec cp '{}' {}.orig \;
    • find 能够找到的是只有和搜索内容 yum.conf 完全一致的 /etc/yum.conf 文件,而 /root/yum.conf.bak 文件虽然含有搜索关键字,但是不会被找到
    • 因此可以看出find命令是完全匹配的,必须和搜索关键字一模一样才会列出,可以根据不同搜索模式多加partern,或者regex。
  2. 提示删除存在时间超过3天以上的joe的临时文件 find /tmp -ctime +3 -user joe -ok rm '{}' \;
  3. 在主目录中寻找可被其它用户写入的文件 find ~ -perm -002 -exec chmod o-w '{}' \;
  4. 查找/data下的权限为644,后缀为sh的普通文件,增加执行权限 find /data –type f -perm 644 -name “*.sh” –exec chmod 755 '{}' \;
  5. 查看/home的目录 find /home –type d -ls

4. 参数替换—{xargs}

由于很多命令不支持管道|来传递参数,xargs用于产生某个命令的参数

xargs可以读入 stdin 的数据,并且以空格符或回车符将

stdin 的数据分隔成为参数一个一个传给后面的命令

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

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

  • 示例:
find和xargs的组合:find | xargs COMMAND ls | xargs rm 删除当前目录下的大量文件 find /sbin/ -perm +700 | ls -l 这个命令是错误的,因为ls命令没有标准输入,它需要的是参数而不是标准输入。 find /bin/ -perm /7000 | xargs ls -Sl 查找有特殊权限的文件,只要3个sst有一个即可 find /bin/ -perm -7000 | xargs ls -Sl 此命令和上面有何区别? 答:查找有特殊权限的文件,3个特殊权限都必须拥有 ------------------------------------------ find -type f -name “\*.txt” -print0 | xargs -0 rm 以字符nul分隔,这是针对**文件名中有空格符以及任何其他特殊字符**的文件来说的 - 注意:nul它并不是空字符的意思,它是\0 ascii中第一个字符

4.1. xargs实用举例:

4.1.1. xargs配合进行多用户创建

  • xargs后面默认隐藏了echo,后面不加命令的话会把前面传递进来的值显示一遍。但是它会把前面输入的值里面的回车默认给换成空格

  • 因为 useradd 不支持一次创建多个用户,并且也不支持用户名之间有空格,所以直接传递会报错,必须用xargs -n 1命令让它每行只显示一个参数,然后就换行。

  • 这样配合这个命令便可创建多用户了。

  • 例子:

20:11[root@centos7 /run/media/root/CentOS 7 x86_64/Packages]# seq 5 1 2 3 4 5 20:11[root@centos7 /run/media/root/CentOS 7 x86_64/Packages]# seq 5|xargs 1 2 3 4 5 echo newuser{1..5} |xargs -n 1 useradd
  • xargs它本身也是有一个默认换行的长度。因为用touch或者rm命令等,他们本身支持多个参数,所以可以不定义xargs后每一行有多少个参数,但useradd这种一次只能一个的,必须定义一行一个。
  • 用echo {1..100000} |xargs |wc -l 可知分成5行
  • 用echo {1..100000} |xargs >f1.t ,查看f1 ,得知一行有23695个参数,这也是默认换行的每一行最多的参数,touch 等可以支持这么多的参数。

5. 压缩、解压缩及归档工具—{compress,gzip,zcat,bzip2,bzcat,xz,xzcat,,zip,tar,cpio}

  1. file-roller(图像化工具)
  2. compress/uncompress: .Z
  3. gzip/gunzip: .gz
  4. bzip2/bunzip2: .bz2
  5. xz/unxz: .xz
  6. zip/unzip
  7. tar
  8. cpio
  • 压缩:牺牲CPU性能节省硬盘空间

5.1. compress/uncompress

compress [-dfvcVr] [-b maxbits] [file ...] 默认删除原文件 -d 解压缩,相当于uncompress -c 结果输出至标准输出,不删除原文件 用法示例:compress -c file >file.Z -v 显示详情 uncompress file.Z 解压缩 - zcat file.Z 不显示解压缩的前提下查看文本文件内容,相当于预览 示例:zcat file.Z >file ,这样的话也就相当于解压缩到file中了
  • 注意:如果改了文件后缀*.Z ,则解压缩无法实施,没有效果。这个压缩工具对于文件后缀有要求。

5.2. gzip/gunzip

gzip [OPTION]... FILE ... 默认删除原文件 -d 解压缩,相当于gunzip -c 结果输出至标准输出,保留原文件不改变 -# 指定压缩比,#取值为1-9,值越大压缩比越大 -r 可以递归压缩文件夹里面的文件,但是是一个一个压缩成一个一个的文件,并非是压缩成一个文件,它不能压缩文件夹 gunzip file.gz 解压缩 - zcat file.gz 不显式解压缩的前提下查看文本文件内容 示例: gzip -c messages >messages.gz gzip -c -d messages.gz > messages zcat messages.gz > messages **cat messages | gzip > m.gz** lscpu |gzip > cpu.gz ; zcat cup.gz - gzip可以对标准输出进行压缩,比如上面的命令,比如常见的应用方式就是对mysql的数据库内容进行查询之后,再利用管道符号利用gzip对其进行备份压缩。(其实这4个压缩命令都可以,)

5.3. bzip2/bunzip2/bzcat

bzip2 [OPTION]... FILE ... -k keep, 保留原文件 -c 结果指向标准输出 -d 解压缩 -# 1-9,压缩比,默认为9 bunzip2 file.bz2 解压缩 - bzcat file.bz2 不显式解压缩的前提下查看文本文件内容

5.4. xz/unxz/xzcat

xz [OPTION]... FILE ... -k keep, 保留原文件 -c 结果指向标准输出 -d 解压缩 -# 压缩比,取值1-9,默认为6 unxz file.xz 解压缩 - xzcat file.xz 不显式解压缩的前提下查看文本文件内容
  • 注意只有gzip才有-r选项,上面4个都是针对文件来压缩的

5.5. zip/unzip :打包并同时压缩

打包压缩 zip –r /backup/sysconfig /etc/sysconfig/ 解包解压缩 unzip sysconfig.zip cat /var/log/messages | zip messages - unzip -p message > message
  • 注意: zip -r filezip lists , 前面写的是压缩后的文件名,后面的才是需要被压缩的文件列表或者文件夹。
  • 前面的文件名可以不用加上zip后缀,它会自己加上,后面的lists如果是文件夹,它会把它的路径记下来,然后解压的时候会在当前的目录里面生成这个路径(相当于把当前路径当做压缩时的路径的相对路径了,如果压缩时写的绝对路径,则把当前路径当做根路径

5.6. tar工具:打包文件(也可顺便用三种压缩),解包(并可自动解压)

tar [OPTION]... [FILE]... (1) 创建新归档,保留权限(-p选项)(但是保留不住ACL权限,需要单独备份),查看过程(-v选项,脚本中可以去掉这个),-f指向归档 tar -cpvf /PATH/FILE.tar FILE... (2) 追加文件至归档: 注:不支持对已经压缩过的tar包进行追加,tar命令默认不压缩只是打包,可以配合-j -J -z同时打包; tar -r -v -f /PATH/FILE.tar FILE... (3) 查看归档文件中的文件列表 tar -t -v -f /PATH/FILE.tar (4) 展开归档 tar -x -v -f /PATH/FILE.tar tar -x -v -f /PATH/FILE.tar -C(大写) /PATH/ (5) 结合压缩工具实现:归档并压缩 -j: bzip2, -z: gzip, -J: xz
  • 注意 -c创建新归档,-f指向归档,同时用可以 ,也可以单独用-f ,但没有单独用-c的。
  • tar 命令不看文件后缀,可以解包解压,修改后缀也没事
  • 同理,解压解包也会保留原文件的路径,如果不加-C(大写) 则会解压到当前路径,并把当前路径当做之前压缩时写的路径的参考路径(写的绝对路径则把当前路径当做根)(注意它压缩的时候会删除掉最前面的根/,避免解压覆盖原文件,是个很好的功能)。
  • tar xvf 可以加J z j解压相对应的压缩包,但也可以不加,它会自动解压并且解包,不需要多此一举。而且它不看后缀,可以自动判断并解压解包。
    -exclude 排除文件 tar zcvf /root/a3.tgz --exclude=/app/host1 --exclude=/app/host2 /app -T 选项,指定包含需要压缩的文件列表的文件,其中这个文件每一行所写的就是需要压缩的文件或文件夹 -X 选项指定包含要排除的文件列表的文件,和上面-T刚好对应。 tar zcvf mybackup.tgz -T /root/includefilelist -X /root/excludefilelist

5.6.1. split:分割一个文件为多个文件

```
分割大的 tar 文件或tar.##压缩文件为多份小文件
用法:split -b Size –d tar-file-name prefix-name

示例:
1. 以数字排序分割每个文件,比如 mybackup-parts01,mybackup-parts02,...
命令:split -b 1M –d mybackup.tgz mybackup-parts 

2. 以字母排序分割每个文件,比如 mybackup-partsaa,mybackup-partsab,...
命令:split -b 1M mybackup.tgz mybackup-parts

合并:
cat mybackup-parts* > mybackup.tar.gz

- -d选项就是用数字分每个part,不加的话默认就是用字母分割每个part
```

5.7. cpio :老牌打包工具(不带压缩)

  • 功能:复制文件从或到归档
  • cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以“.cpio” 或者“.tar” 结尾的文件
  • cpio [选项] > 文件名或者设备名
  • cpio [选项] < 文件名或者设备名
  • 注意i和o都是针对于内存来说的输入内存处理解包和内存数据输出到硬盘打包
  • 选项
-o 将内存中的数据(前面可用管道)拷贝打包成文件或者将文件打包 ,默认输出到标准输出(屏幕),可以用重定向输出到文件中(相当于-F,可以用-F 代替 重定向符号<\>).例如 ls | cpio -ov > ls.cpio -O filename 输出到指定的归档文件名 -A 向已存在的归档文件中追加文件 -i 解包,将打包文件解压到当前文件夹或将设备上的备份还原到系统,可用重定向输入,(-d可以创建文件夹) -I filename 对指定的归档文件名解压 -t 预览,查看打包后的文件内容列表,可以用重新定向输入的方式,例如cpio -t <#### .cpio ,同样也可用管道方式查看包内文件,比如 rpm2cpio ####.rpm | cpio -tv -F filename 使用指定的文件名替代标准输入或输出 ,相当于重定向符号<\> -d 解包生成目录,在cpio还原时,自动的建立目录 -v 显示打包过程中的文件名称

5.7.1. 例子cpio

- 将etc目录打包: find ./etc -print |cpio -ov >bak.cpio - 将/data内容追加bak.cpio find /data | cpio -ovA -F bak.cpio - 内容预览 cpio –t < etc.cpio cpio -tv < etc.cpio (显示列表详细信息) rpm2cpio ####.rpm | cpio -tv 管道方式使用查看rpm包内文件 - 解包文件 cpio –idv < etc.cpio (解包经测试-d不用也可以,记住-d选项,万一无法生成加上它)
  • file命令可以查看文件类型,后面直接跟文件即可
最后修改日期: 2021年7月7日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。