在文件系统上查找符合条件的文件
文件查找:
工作特点:
格式:
locate [OPTION]... PATTERN...
常用选项:
-i 不区分大小写
-n N 只列举前N个匹配项
-r 使用基本的正则表达式
示例:locatedb 创建数据库
[root@centos7 ~]#yum -y install mlocate
[root@centos7 ~]#locate conf
locate: can not stat () `/var/lib/mlocate/mlocate.db': No such file or directory
[root@centos7 ~]#updatedb
[root@centos7 ~]#ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 978791 Oct 11 22:57 /var/lib/mlocate/mlocate.db
[root@centos7 ~]#locate -n 3 conf
/backup/etc_2022-10-05/GeoIP.conf
/backup/etc_2022-10-05/asound.conf
/backup/etc_2022-10-05/chkconfig.d
示例:文件的创建与删除无法立即更新数据库
[root@centos7 ~]#touch test1.log
[root@centos7 ~]#locate test1.log
[root@centos7 ~]#updatedb
[root@centos7 ~]#locate test1.log
/root/test1.log
[root@centos7 ~]#rm -f test1.log
[root@centos7 ~]#locate test1.log
/root/test1.log
find 是实时查找工具,通过遍历指定路径完成文件查找
工作特点:
格式
find [option] ... [查找路径] [查找条件] [处理动作]
查找路径:具体查找的目标路径,默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
-maxdepth level 最大搜索目录深度,指定目录下的文件为第1级
-minddepth level 最小搜索目录深度
范例:
find /etc -maxdepth 2 -mindepth 2
-depth
示例:
[root@Rocky8-mini ~]# find /data/test/
/data/test/
/data/test/f2.txt
/data/test/f1.txt
[root@Rocky8-mini ~]# find /data/test/ -depth
/data/test/f2.txt
/data/test/f1.txt
/data/test/
-name "文件名称" # 支持使用glob,通配符需要加双引号引起来
-iname "文件名称" # 不区分字母大小写
-inum n # 按inode号查找
-samefile name # 相同inode号的文件
-links n # 链接数为n的文件
-regex "PATTERN" # 以PATTERN匹配整个文件路径,而非文件名称
示例:
[root@Rocky8-mini ~]# find /data/ -name "*.txt"
/data/test/f2.txt
/data/test/f1.txt
-user USERNAME # 查找属主为指定用户的文件
-group GROUPNAME # 查找属组为指定组的文件
-uid USERID # 查找属主为指定的UID的文件
-gid GROUPID # 查找属组为指定的GID文件
-nouser # 查找没有属主的文件
-nogroup # 查找没有属组的文件
-type TYPE
TYPE 可以是以下形式:
f: 普通文件
d: 目录文件
l: 符号链接文件
s: 套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
-empty
[root@Rocky8-mini data]# find /data/test/ -empty
与 -a
或 -o
非 -not
示例
[root@Rocky8-mini ~]# find /etc/ -type d -o -type l | wc -l
299
[root@Rocky8-mini ~]# find /etc/ -type d -o -type l -ls | wc -l
84
[root@Rocky8-mini ~]# find /etc/ \( -type d -o -type l \) -ls | wc -l
299
德摩根定律
!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
查找条件
-path PATH
-prune 剪切
示例
-- 查找/etc/下,除了/etc/security/目录的其它所有.conf后缀的文件 --
[root@Rocky8-mini ~]# find /etc/ -path '/etc/security' -a -prune -o -name "*.conf" | wc -l
80
-- 查找/etc/下,除/etc/security和/etc/systemd,/etc/dbus-1三个目录的所有.conf后缀的文件 --
[root@Rocky8-mini ~]# find /etc/ \( -path "/etc/security" -o -path "/etc/systemd" -o -path "/etc/dbus-1" \) -a -prune -o -name "*.conf" | wc -l
71
文件大小 常用单位:k,M,G
-size [+|-]#UNIT
#UNIT: (#-1,#]
-#UNIT: [0,#-1]
+#UNIT: (#,oo)
时间戳
以天为单位
-atime [+|-]#
#:[#,#+1)
+#:[#+1,oo]
-#:[0,#)
-mtime
-ctime
以分钟为单位
-amin
-mmin
-cmin
-perm [/|-]MODe
MODE: 精确权限匹配
/MODE: 任何一类(u,g,o)对象的权限中只要能一位匹配即可
-MODE: 每一类对象都必须同时拥有为其指定的权限标准
示例
find /etc -perm /060 -ls 只有当文件的属组有读或写权限时就可匹配到
find /etc -perm -644 -ls 文件的属主有读写权限,属组和其它有读权限
-regextype type
-regex pattern
-print 默认动作,将结果输出至屏幕
-ls 类似对查找到的文件做"ls -dils"
-fls FILE 对查找到文件的长格式信息保存到指定文件中
-delete 删除查找到的文件
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对每个文件执行命令前需交互式确认
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
{}: 用于引用查找到的文件名称自身
note:find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令
示例
# 备份配置文件,并添加.bak后缀
find -name "*.conf" -exec cp {} {}.bak \;
# 删除存在时间查过三天以上的Tom的临时文件
find /tmp -ctime +3 -user Tom -ok rm {} \;
# 在主目录中查找可被其他用户写入的文件并删除其权限
find ~ -perm -002 -exec chmod o-w {} \;
# 查找/data下的权限为644,后缀为sh的普通文件,增加执行权限
find /data -perm -644 -type f -name "*.sh" -exec chmod 755 {} \;
有些命令不支持管道来传递参数,如 ls 命令。利用 xargs 命令可以将管道符传递过来的标准输入进行处理,然后传递到指定命令的参数位置上。
find 经常和 xargs 命令进行组合使用,如find | xargs COMMAND
示例:
# xargs 的默认行为:对多行标准输入进行处理,用空格代替换行符,成为一行,传递给 echo 命令作为参数,进行输出
[root@Rocky8-mini ~]# seq 5 | xargs
1 2 3 4 5
[root@Rocky8-mini ~]# find -name "*.txt" | xargs rm
[root@Rocky8-mini ~]# find -name "*.conf" | xargs ls -Sl
# xargs 可以将一行中空格作为分隔符,用 -n# 选项,指定将 # 个空格替换成换行符,输出多行
[root@Rocky8-mini ~]# echo {1..6} | xargs -n3
1 2 3
4 5 6
# -d 选项为输入指定一个定制的定界符
# echo -n 不输出尾随的换行符
[root@Rocky8-mini ~]# echo -n "IXloveXyou!" | xargs -d X
I love you!
# find配合xargs实现从大到小的文件排序显示
[root@Rocky8-mini ~]# find /root -type f | xargs ls -lSh
-rw------- 1 root root 29K Oct 15 10:59 /root/.bash_history
-rw------- 1 root root 11K Oct 16 06:48 /root/.viminfo
-rw-------. 1 root root 1.5K Mar 13 2022 /root/anaconda-ks.cfg
# 批量创建和删除用户
[root@Rocky8-mini ~]# echo user{1..5} | xargs -n1 useradd
[root@Rocky8-mini ~]# echo user{1..5} | xargs -n1 userdel -r
#使用 null 字符代替空格作为分界符
[root@Rocky8-mini ~]# touch "a b.txt" a.txt b.txt
[root@Rocky8-mini ~]# find -type f | xargs ls
[root@Rocky8-mini test]# find -type f | xargs ls
ls: cannot access './a': No such file or directory
./a.txt ./b.txt b.txt
## 对查找出的文件使用null字符作为分界符
[root@Rocky8-mini test]# find -type f -print0
./b.txt./a.txt./a b.txt[root@Rocky8-mini test]#
## 使用null字符代替空格做分界符
[root@Rocky8-mini test]# find -type f -print0 | xargs -0 ls -l
-rw-r--r-- 1 root root 0 Oct 16 07:03 './a b.txt'
-rw-r--r-- 1 root root 0 Oct 16 07:03 ./a.txt
-rw-r--r-- 1 root root 0 Oct 16 07:03 ./b.txt
ASCII码中真正的0字符,即null字符
1、查找/var目录下属主为root,且属组为mail的所有文件
find /var \( -user root -a -group mail \) -ls
2、查找/var目录下不属于root、lp、gdm的所有文件
find /var -not \( -user root -o -user lp -o -user gdm \)
3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
find /var -mtime -7 -a -user root -a -user postfix
4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
find / -atime -7 -a \( -nouser -o -nogroup \)
5、查找/etc目录下大于1M且类型为普通文件的所有文件
find /etc -type f -a -size +1M
6、查找/etc目录下所有用户都没有写权限的文件
find /etc -not -perm /222
7、查找/etc目录下至少有一类用户没有执行权限的文件
find /etc -not -perm -111
8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
find /etc/init.d -perm -113
主要针对单个文件压缩,而非目录。
格式
compress Options [file...]
uncompress file.Z
常用选项
-d 解压缩,相当于 uncompress
-c 结果输出至标准输出,不删除源文件
-v 显示详情
zcat file.Z 不解压缩的前提下查看文本的文件内容
zcat file.Z > file
格式
gzip [OPTIONs] FILE...
常用选项
-k keep,保留源文件,centos8新特性
-d 解压缩,相当于gunzip
-c 结果输出至标准输出,保留源文件
-# 指定压缩比(1-9)
zcat file.gz
常用选项
-k keep,保留源文件,centos8新特性
-d 解压缩,相当于gunzip
-c 结果输出至标准输出,保留源文件
-# 指定压缩比(1-9)
# 不解压缩的前提下查看文本的文件内容
bzcat file.bz2
常用选项
-k keep,保留源文件
-d 解压缩
-c 结果输出至标准输出,保留源文件不改变
-# 指定压缩比,# 取值 1-9,默认为6
# 不解压缩的前提下查看文本的文件内容
xzcat file.xz
zip 可以实现打包目录和多个文件成一个文件并压缩,但可能会丢失文件属性信息,如:所有者和组信息,一般建议使用 tar 代替。
[root@Rocky8-mini test]# 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@Rocky8-mini test]# zip -r /backup/test.zip /data/test/
# 不包括目录本身,只打包目录内的文件和子目录
[root@Rocky8-mini test]# cd /data/test/; zip -r /root/test.zip *
# 默认解压缩至当前目录
[root@Rocky8-mini ~]# unzip test.zip
# 指定解压缩目录
[root@Rocky8-mini ~]# unzip test.zip -d /backup/
实例1:交互式加密和解密
[root@Rocky8-mini test]# zip -e test.zip *
Enter password:
Verify password:
adding: a b.txt (stored 0%)
adding: a.txt.bz2 (stored 0%)
adding: b.txt (stored 0%)
[root@Rocky8-mini test]# unzip test.zip -d /backup/
Archive: test.zip
[test.zip] a b.txt password:
extracting: /backup/a b.txt
extracting: /backup/a.txt.bz2
extracting: /backup/b.txt
实例2:非交互式加密和解密
[root@Rocky8-mini test]# zip -P 123456 test.zip *
[root@Rocky8-mini test]# unzip -P 123456 test.zip -d /backup/
tar 即磁带归档,可以对目录和多个文件打包成一个文件,并且可以压缩,保留文件属性不丢失,常用于备份功能。
选项:
-A 新增文件到已经存在的备份文件
-b<区块数目> 设置每个记录的区块数目,每个区块大小为12Bytes
-B 读取数据时重设区块的大小
-c 建立新的备份文件
-C<目的目录> 切换到指定的目录
-d 对比备份文件内和文件系统上的文件的差异
-f<备份文件> 指定备份文件
-F<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 -c -f -p /PATH/TO/SOMEFILE.tar FILE...
tar -cpf /PATH/TO/SOMEFILE.tar FILE...
2、追加文件至归档,不支持对压缩文件追加
tar -rf /PATH/TO/SOMEFILE.tar
3、查看归档文件中的文件列表
tar -t -f /PATH/TO/SOMEFILE.tar
4、展开归档
tar xf /PATH/TO/SOMEFILE.tar
tar xf /PATH/TO/SOMEFILE.tar -C /PATH/TO/DIR
5、结合压缩工具实现归档并压缩
-z 相当于gzip压缩工具
-j 相当于bzip2
-J 相当于xz
示例
[root@Rocky8-mini ~]# tar zcvf test.tar.gz /data/test/
[root@Rocky8-mini ~]# tar jcvf test.tar.bz2 /data/test/
[root@Rocky8-mini ~]# tar Jcvf test.tar.xz /data/test/
[root@Rocky8-mini ~]# ls
test.tar.bz2 test.tar.gz test.tar.xz
# 只打包目录内的文件,不包括目录本身
[root@Rocky8-mini ~]# cd /data/test/
[root@Rocky8-mini test]# tar zcvf /root/test.tar.gz *
6、对文件进行归档压缩式,排除指定的文件
--exclude 排除文件
tar zcvf /root/test.tgz --exclude=/data/test/a.txt --exclude=/data/test/b.txt /data/test
7、选择指定的输入和选择要排除的文件列表
-T 选择指定的输入文件
-X 选择只当包含要排除的文件列表
tar zcvf backup.tgz -T /root/includefilelist -X /root/excludefilelist
split 命令可以将一个文件分割成多个文件
示例
# 创建一个10M的文件
[root@Rocky8-mini test]# dd if=/dev/zero of=/data/test/bigfile bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.00859871 s, 1.2 GB/s
# -b 指定分割的大小
[root@Rocky8-mini test]# split -b 1M bigfile smallfile
[root@Rocky8-mini test]# ll -h
total 20M
-rw-r--r-- 1 root root 10M Mar 23 04:23 bigfile
-rw-r--r-- 1 root root 1.0M Mar 23 04:24 smallfileaa
-rw-r--r-- 1 root root 1.0M Mar 23 04:24 smallfileab
-rw-r--r-- 1 root root 1.0M Mar 23 04:24 smallfileac
-rw-r--r-- 1 root root 1.0M Mar 23 04:24 smallfilead
-rw-r--r-- 1 root root 1.0M Mar 23 04:24 smallfileae
-rw-r--r-- 1 root root 1.0M Mar 23 04:24 smallfileaf
-rw-r--r-- 1 root root 1.0M Mar 23 04:24 smallfileag
-rw-r--r-- 1 root root 1.0M Mar 23 04:24 smallfileah
-rw-r--r-- 1 root root 1.0M Mar 23 04:24 smallfileai
-rw-r--r-- 1 root root 1.0M Mar 23 04:24 smallfileaj
# -d 分割后的文件用数字后缀
[root@Rocky8-mini test]# split -b 1M -d bigfile smallfile | ll -h
total 20M
-rw-r--r-- 1 root root 10M Mar 23 04:23 bigfile
-rw-r--r-- 1 root root 0 Mar 23 04:28 smallfile00
-rw-r--r-- 1 root root 468K Mar 23 04:28 smallfile01
-rw-r--r-- 1 root root 1.0M Mar 23 04:28 smallfile02
-rw-r--r-- 1 root root 1.0M Mar 23 04:28 smallfile03
-rw-r--r-- 1 root root 1.0M Mar 23 04:28 smallfile04
-rw-r--r-- 1 root root 1.0M Mar 23 04:28 smallfile05
-rw-r--r-- 1 root root 1.0M Mar 23 04:28 smallfile06
-rw-r--r-- 1 root root 1.0M Mar 23 04:28 smallfile07
-rw-r--r-- 1 root root 1.0M Mar 23 04:28 smallfile08
-rw-r--r-- 1 root root 1.0M Mar 23 04:28 smallfile09
# 将切割后的小文件合并成一个大文件
[root@Rocky8-mini test]# cat smallfile* > bigfile1
[root@Rocky8-mini test]# ll -h bigfile1
-rw-r--r-- 1 root root 10M Mar 23 04:29 bigfile1
cpio 是通过重定向的方式将文件进行打包备份、还原恢复的工具,它可以解压缩以“.cpio”和“.tar”结尾的文件
格式
cpio [option] > 文件名或设备名
cpio [option] < 文件名或设备名
常用选项
-o output模式,打包,将标准输入传入的文件名打包后发送到标准输出
-i input模式,解包,对标准输入传入的打包文件名解包到当前目录
-t 预览,查看标准输入传入的打包文件中包含的文件列表
-O filename 输出到指定的归档文件名
-A 向已存在的归档文件中追加文件
-I filename 对指定的归档文件名解压
-F filename 使用指定的文件名替代标准输入或输出
-d 解包生成目录,在cpio还原时,自动的建立目录
-v 显示打包过程中的文件名称
示例
# 备份/etc目录
[root@Rocky8-mini ~]# find /etc -print | cpio -ov > bak.cpio
# 将/data内容追加到bak.cpio
[root@Rocky8-mini ~]# find /data | cpio -oA -F bak.cpio
# 内容预览
[root@Rocky8-mini ~]# cpio -tv < bak.cpio
# 解包文件
[root@Rocky8-mini ~]# cpio -idv < bak.cpio