文件查找和压缩

文件查找和压缩

文件查找的两个命令 locate find
————————————————————-
locate locate file
非实时查找,查找文件的路径, 数据库不会实时更新,查找速度快
路径中只要包含file名就全部列出

-i 不区分大小写的搜索
例 搜索以”.conf”结尾的文件 locate -r “\.conf$”
-n N 只列举前N个匹配项目
-r 使用正则表达式
例 locate -r “^/ect/.\.conf$”
updatedb 数据库更新命令
—————————————————————-
find 默认递归搜索 查找速度慢 查找更精确 实时查找 可能只搜索用户具备读取
和执行权限的目录
find [OPTION]… [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;
默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
-maxdepth level 最大搜索目录深度,指定目录为第1级
-mindepth level 最小搜索目录深度

根据文件名和inode查找:
-name “文件名称”:支持使用glob
*, ?, [], [^]
-iname “文件名称”:不区分字母大小写
-inum n 按inode号查找
-samefile name 相同inode号的文件
-links n 链接数为n的文件
-regex “PATTERN”:以PATTERN匹配整个文件路径字符串,而不仅仅是文
件名称
例 find /etc/ -maxdepth2 -mindepth2 -name passwd 显示/etc/下包含passwd的两级目录
find /data -name “*f1″查找data目录下包含f1的文件,此处的*表示通配符,引号必须加
find /home -user wang -ls 长格式显示所有者为wang的文件
useradd xixi -u 1004 将无主文件重新赋予新的所有者
根据属主、属组查找:
-user USERNAME:查找属主为指定用户(UID)的文件
-group GRPNAME: 查找属组为指定组(GID)的文件
-uid UserID:查找属主为指定的UID号的文件
-gid GroupID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
例 find /home -nouser -o -nogroup 查找无主或无组的文件

根据文件类型查找:
-type TYPE:
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
空文件或目录
-empty
find /app -type d -empty

组合条件:
与:-a
或:-o
非:-not, !
德·摩根定律:
(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
例 找出/tmp目录下,属主不是root,且文件名不以f开头的文件
find /tmp \( -not -user root -a -not -name ‘f*’ \) -ls
find /tmp -not \( -user root -o -name ‘f*’ \) –ls

查找/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”
查找data 目录下非空非普通的文件
find /data/ ! \( -empty -o -type f \)

根据文件大小来查找:(表示不包括 ]包括
-size [+|-]#UNIT
常用单位:k, M, G,c(byte)
#UNIT: (#-1, #]
如:6k 表示(5k,6k]
-#UNIT:[0,#-1]
如:-6k 表示[0,5k]
+#UNIT:(#,∞)
如:+6k 表示(6k,∞)

根据时间戳:
以“天”为单位;
-atime [+|-]#,
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-mtime
-ctime
atimee [+|-]#以天为单位。

-atime 1 大于等于一天小于两天

-atime -1 小于一天到零天

-atime +1 大于等于一天的全部
以“分钟”为单位:
-amin
-mmin
-cmin
示例
find /etc/ -mmin -1 查找一分钟以内被修改的文件

根据权限查找:
-perm [/|-]MODE
MODE: 精确权限匹配
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+ 从centos7开始淘汰
-MODE:每一类对象都必须同时拥有指定权限,与关系
0 表示不关注
find -perm 755 会匹配权限模式恰好是755的文件
只要当任意人有写权限时,find -perm +222就会匹配
只有当每个人都有写权限时,find -perm -222才会匹配
只有当其它人(other)有写权限时,find -perm -002才会匹配
find -perm 666 查找当前文件夹下权限位666的文件
find -perm /666 -ls 只要有一个权限符合就行
find -perm -666 -ls -和/的时候才用) 先666转化为110 对应匹配各位,检查1的位,
0的位不检查所以可有可无 -表示交集(都有) /表示并集
-222表示都要有写权限

处理动作
简单理解为当我们把要查找的内容搜索出来以后要做的事情

-print:默认的处理动作,显示至屏幕
-ls:类似于对查找到的文件执行“ls -l”命令
-delete:删除查找到的文件
-fls file:查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
带ok exec结束必须要以\;结束
{}: 用于引用查找到的文件名称自身
find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令
示例 find -perm -002 -delete 对符合条件的文件删除(没有任何提示建议慎用)
将查找的内容全部移动到另一个地方(改名,常用作备份)
find /mnt -name “f*” -exec mv {} {}. bak \;
——————————————————————————————-
参数替换xargs

由于很多命令不支持管道|来传递参数,而日常工作中有这个必要,所以就有了xargs命令
xargs用于产生某个命令的参数,xargs 可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分隔成为arguments
注意:文件名或者是其他意义的名词内含有空格符的情况
有些命令不能接受过多参数,命令执行可能会失败,xargs可以解决
示例:
xargs将前面的输入用空格分开然后传给后面的命令
echo f{1..100} | xargs -n1 touch n1 n1表示每次只创建一个文件 数字可以修改
ls f* |xargs rm
find /sbin -perm +700 |ls -l 这个命令是错误的
find /sbin -perm +700 | xargs ls –l
find和xargs格式:find | xargs COMMAND
———————————————————————————–
find 示例
备份配置文件,添加.orig这个扩展名
find -name “*.conf” -exec cp {} {}.orig \;
提示删除存在时间超过3天以上的joe的临时文件
find /tmp -ctime +3 -user joe -ok rm {} \;
在主目录中寻找可被其它用户写入的文件
find ~ -perm -002 -exec chmod o-w {} \;
查找/data下的权限为644,后缀为sh的普通文件,增加执行权限
find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} \;
查看/home的目录
find /home –type d -ls
—————————————————————————
压缩、解压缩及归档工具

compress/uncompress
compress [-dfvcVr] [-b maxbits] [file …]
-d: 解压缩,相当于uncompress
-c: 结果输出至标准输出,不删除原文件
-v: 显示详情
uncompress 解压缩
zcat file.Z >file
compress file 压缩时会删除原文件
gzip/gunzip
gzip [OPTION]… FILE …
-d: 解压缩,相当于gunzip
-c: 将压缩或解压缩的结果输出至标准输出
-#:1-9,指定压缩比,值越大压缩比越大
zcat:不显式解压缩的前提下查看文本文件内容
实例:
gzip -9 mm
gzip -c messages >messages.gz
gzip -c -d messages.gz > messages
zcat messages.gz > messages
gunzip mm.gz 解压缩
zcat mm.gz 查看压缩文件

bzip2/bunzip2/bzcat

bzip2 [OPTION]… FILE …
-k: keep, 保留原文件
-d:解压缩
-#:1-9,压缩比,默认为9
bzcat:不显式解压缩的前提下查看文本文件内容

xz/unxz/xzcat
xz [OPTION]… FILE …
-k: keep, 保留原文件
-d:解压缩
-#:1-9,压缩比,默认为6
xzcat: 不显式解压缩的前提下查看文本文件内容
gz bz2 常用的两种压缩文件

zip/unzip
打包压缩
zip –r /testdir/sysconfig /etc/sysconfig/
解包解压缩
unzip sysconfig.zip
cat /var/log/messages | zip messages –
unzip -p message > message
示例 zip -r /etc/sysconfig 把后面的文件压缩为z.zip
cat /var/log/messages|zip messages – 此处的-表示把前面的作为
标砖输入传给zip
————————————————————–
tar工具

tar(Tape ARchive,磁带归档的缩写)
tar [OPTION]…
(1) 创建归档
tar -cpvf /PATH/TO/SOMEFILE.tar FILE…
c 表示创建 f表示需要打包的文件名
(2) 追加文件至归档: 注:不支持对压缩文件追加
tar -r -f /PATH/TO/SOMEFILE.tar FILE…
(3) 查看归档文件中的文件列表
tar -t -f /PATH/TO/SOMEFILE.tar
(4) 展开归档
tar -x -f /PATH/TO/SOMEFILE.tar
tar -x -f /PATH/TO/SOMEFILE.tar -C /PATH/
(5) 结合压缩工具实现:归档并压缩
-j: bzip2, -z: gzip, -J: xz
-T选项指定输入文件,-X选项指定包含要排除的文件列表
tar zcvf mybackup.tgz -T /root/includefilelist -X /root/excludefilelist
tar -cpvf data.tar /data p表示保留属性 f表示文件 /data表示要打包的目录
tar tvf *.tar 预览打包文件
tar x.*tar -C/mnt 解压缩 -C/mnt 解压缩之后的路径
无论什么样的后缀都可以解开
tar xvf data.tar.bz2 -C /mnt

分割大的 tar 文件为多份小文件:
split –b Size –d tar-file-name prefix-name prefix前缀
split -b 1M –d mybackup.tgz mybackup-parts
split -b 1M mybackup.tgz mybackup-parts
合并:
cat mybackup-parts* > mybackup.tar.gz
—————————————————————————
cpio

功能:复制文件从或到归档
cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以“.cpio”或者“.tar”结尾的文件
cpio [选项] > 文件名或者设备名
cpio [选项] < 文件名或者设备名
选项
-o 将文件拷贝打包成文件或者将文件输出到设备上
-i 解包,将打包文件解压或将设备上的备份还原到系统
-t 预览,查看文件内容或者输出到设备上的文件内容
-v 显示打包过程中的文件名称。
-d 解包生成目录,在cpio还原时,自动的建立目录
-c 一种较新的存储方式
示例
将etc目录备份:
find ./etc -print |cpio -ov >etc.cpio
内容预览
cpio –tv < etc.cpio
解包文件
cpio –idv < etc.cpio

***********************************************************************
处理文本的工具sed

Stream EDitor, 行编辑器
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),
接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等

用法: 建议使用单引号
sed [option]… ‘script’ inputfile…
常用选项:
-n:不输出模式空间内容到屏幕,即不自动打印
-e: 多点编辑
-f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
-r: 支持使用扩展正则表达式
-i.bak: 备份文件并原处编辑
script:
‘地址命令’
地址定界:
(1) 不给地址:对全文进行处理
(2) 单地址:
#: 指定的行,$:最后一行
/pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步进
1~2 奇数行 从1开始每隔2行
2~2 偶数行
示例 sed -n’2p’ f1 打印文件f1的第二行,系统默认是自动打印末尾
p就等于打印了两次,加-n只打印第二行(p不能取消)
sed -n ‘2~2p’ f1打印文件f1的第二行每隔两行打印一次即打印2,4,。。
sed -n -e ‘2p’ -e ‘6p’ f1 多点编辑 实现结果是打印第二行和第六行

cat sedscript.txt sed -f sedscript.txt f1 sedscript.txt内容为
2~2p(即打印偶数行) 实现结果为1 2 2 3 44 5 66 7 88 9 1010
cat sedscript.txt sed -f sedscript.txt 在f1文件中找出符合sedcript内容的行246810
编辑命令:
d: 删除模式空间匹配的行,并立即启用下一轮循环
p:打印当前模式空间内容,追加到默认输出之后
a [\]text:在指定行后面追加文本
支持使用\n实现多行追加
i [\]text:在行前面插入文本
c [\]text:替换行为单行或多行文本
w /path/somefile: 保存模式匹配的行至指定文件
r /path/somefile:读取指定文件的文本至模式空间中
匹配到的行后
=: 为模式空间中的行打印行号
!:模式空间中匹配行取反处理
s///:查找替换,支持使用其它分隔符,s@@@,s###
替换标记:
g: 行内全局替换
p: 显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中
sed ‘2d’ f1删除f1文件中的第2行
sed ‘2!d’ f1 除第二行以外都删除
sed ‘2’= f1把第2行的内容换为2并打印(实际上删除了原来的内容)
sed ‘2,5a\ ====’ f1 在f1文件的第2行第5行后面加====
sed ‘2,5i\ ====’ f1 在f1文件的第2行第5行前面加====
sed ‘2,5w f2’f1
sed ‘2,5r /etc/issue’ f1 即把/etc/issue/的内容放在f1文件第2到第5行的下面
sed ‘s/root/administrator/’ /etc/passwd 在/etc/passwd文件中的root替换为adminstrator(只替换了一个)
sed ‘s/root/administrator/g’ /etc/passwd 全部替换
sed -r ‘s/(root)/\1er/g’ /etc/passwd把/etc/passwd中的root全部替换为rooter
sed -r ‘s@/bin/bash$@/sbin/bash@’ /etc/passwd 或者
sed -r ‘s@/(bin/bash)$@/s\1@’ /etc/passwd把/etc/passwd中以bash/bash结尾的替换为sbin/bash
sed -r ‘s/(.*)/\1mage/’ /etc/passwd 把/etc/passwd中所有的行尾加mage
sed -r ‘s/(.*)/mage\1/’ /etc/passwd 在/etc/passwd中所有的行首加mage

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/95945

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code