文件查找 在文件系统上查找符合条件的文件
文件查找:
非实时查找(数据库查找):locate
实时查找:find
一、locate
locate 查询系统上预先建立的文件索引数据库 /var/lib/mlocate/mlocate.db
索引的构建是在系统较为空闲时自动进行(周期性任务),执行updatedb可以更新数据库
索引构建过程需要遍历整个根文件系统,很消耗资源
locate 和 updatedb 命令来自于 mlocate 包
工作特点:
查找速度快
模糊查找
非实时查找
搜索的是文件的全路径,不仅仅是文件名
可能只搜索用户具备读取和执行权限的目录
格式:
locate [OPTION]... PATTERN...
常用选项:
1 2 3 -i 不区分大小写 -n N 只列举前N个匹配项 -r 使用基本的正则表达式
示例:locatedb 创建数据库
1 2 3 4 5 6 7 8 9 10 [root@centos7 ~] [root@centos7 ~] 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
示例:文件的创建与删除无法立即更新数据库
1 2 3 4 5 6 7 8 9 [root@centos7 ~] [root@centos7 ~] [root@centos7 ~] [root@centos7 ~] /root/test1.log [root@centos7 ~] [root@centos7 ~] /root/test1.log
二、find find 是实时查找工具,通过遍历指定路径完成文件查找
工作特点:
查找速度略慢
精确查找
实时查找
查找条件丰富
可能只搜索用户具备读取和执行权限的目录
格式
1 2 3 4 5 find [option] ... [查找路径] [查找条件] [处理动作] 查找路径:具体查找的目标路径,默认为当前目录 查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件 处理动作:对符合条件的文件做操作,默认输出至屏幕
2.1 指定搜索目录层级 1 2 -maxdepth level 最大搜索目录深度,指定目录下的文件为第1级 -mindepth level 最小搜索目录深度
范例:
1 find /etc -maxdepth 2 -mindepth 2
2.2 先处理该目录中文件再处理目录本身
示例:
1 2 3 4 5 6 7 8 9 [root@Rocky8-mini ~] /data/test/ /data/test/f2.txt /data/test/f1.txt [root@Rocky8-mini ~] /data/test/f2.txt /data/test/f1.txt /data/test/
2.3 根据文件名和inode查找 1 2 3 4 5 6 -name "文件名称" -iname "文件名称" -inum n -samefile name -links n -regex "PATTERN"
示例:
1 2 3 [root@Rocky8-mini ~] /data/test/f2.txt /data/test/f1.txt
2.4 根据属主、属组查找 1 2 3 4 5 6 -user USERNAME -group GROUPNAME -uid USERID -gid GROUPID -nouser -nogroup
2.5 根据文件类型查找 1 2 3 4 5 6 7 8 9 10 -type TYPE TYPE 可以是以下形式: f: 普通文件 d: 目录文件 l: 符号链接文件 s: 套接字文件 b: 块设备文件 c: 字符设备文件 p: 管道文件
2.6 空文件或目录 1 2 -empty [root@Rocky8-mini data]
2.7 组合条件
示例
1 2 3 4 5 6 [root@Rocky8-mini ~] 299 [root@Rocky8-mini ~] 84 [root@Rocky8-mini ~] 299
德摩根定律
1 2 !A -a !B = !(A -o B) !A -o !B = !(A -a B)
示例
1 2 3 find /tmp \( -not -user root -a -not -name 'f*' \) -ls find /tmp -not \( -user root -o -name 'f*' \) -ls
2.8 排除目录 查找条件
示例
1 2 3 4 5 6 -- 查找/etc/下,除了/etc/security/目录的其它所有.conf后缀的文件 -- [root@Rocky8-mini ~] 80 -- 查找/etc/下,除/etc/security和/etc/systemd,/etc/dbus-1三个目录的所有.conf后缀的文件 -- [root@Rocky8-mini ~] 71
2.9 根据文件大小和时间戳查找 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 文件大小 常用单位:k,M,G -size [+|-] - + 时间戳 以天为单位 -atime [+|-] + - -mtime -ctime 以分钟为单位 -amin -mmin -cmin
2.10 根据权限查找 1 2 3 4 -perm [/|-]MODE MODE: 精确权限匹配 /MODE: 任何一类(u,g,o)对象的权限中只要能一位匹配即可 -MODE: 每一类对象都必须同时拥有为其指定的权限标准
示例
1 2 find /etc -perm /060 -ls 只有当文件的属组有读或写权限时就可匹配到 find /etc -perm -644 -ls 文件的属主有读写权限,属组和其它有读权限
2.11 正则表达式 1 2 -regextype type -regex pattern
2.12 处理动作 1 2 3 4 5 6 7 8 9 -print 默认动作,将结果输出至屏幕 -ls 类似对查找到的文件做"ls -dils" -fls FILE 对查找到文件的长格式信息保存到指定文件中 -delete 删除查找到的文件 -ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对每个文件执行命令前需交互式确认 -exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令 {}: 用于引用查找到的文件名称自身 note:find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令
示例
1 2 3 4 5 6 7 8 9 10 11 find -name "*.conf" -exec cp {} {}.bak \; find /tmp -ctime +3 -user Tom -ok rm {} \; find ~ -perm -002 -exec chmod o-w {} \; find /data -perm -644 -type f -name "*.sh" -exec chmod 755 {} \;
2.13 查找指定的时间戳文件并删除 1 2 3 4 -newermt选项后面通常会跟一个日期字符串,表示“查找在此日期之后修改的文件”。这个日期字符串的格式通常是YYYY-MM-DD,也可以包含时间,例如YYYY-MM-DD HH:MM:SS。 例如,-newermt 2021-01-01会查找所有在2021年1月1日之后修改的文件。 -newermt 选项前加上一个感叹号!,比如! -newermt 2021-01-01,那么这个命令就表示“查找所有在2021年1月1日之前修改的文件”。
例:
1 2 find /path-to-your-directory/ -type f -newermt 2017-01-01 ! -newermt 2018-01-01 -exec rm {} \;
三、参数替换 xargs 有些命令不支持管道来传递参数,如 ls 命令。利用 xargs 命令可以将管道符传递过来的标准输入进行处理,然后传递到指定命令的参数位置上。
find 经常和 xargs 命令进行组合使用,如find | xargs COMMAND
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 [root@Rocky8-mini ~] 1 2 3 4 5 [root@Rocky8-mini ~] [root@Rocky8-mini ~] [root@Rocky8-mini ~] 1 2 3 4 5 6 [root@Rocky8-mini ~] I love you! [root@Rocky8-mini ~] -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 ~] [root@Rocky8-mini ~] [root@Rocky8-mini ~] [root@Rocky8-mini ~] [root@Rocky8-mini test ] ls : cannot access './a' : No such file or directory./a.txt ./b.txt b.txt [root@Rocky8-mini test ] ./b.txt./a.txt./a b.txt[root@Rocky8-mini test ] [root@Rocky8-mini test ] -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的所有文件
1 find /var \( -user root -a -group mail \) -ls
2、查找/var目录下不属于root、lp、gdm的所有文件
1 find /var -not \( -user root -o -user lp -o -user gdm \)
3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
1 find /var -mtime -7 -a -not -user root -a -not -user postfix
4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
1 find / -atime -7 -a \( -nouser -o -nogroup \)
5、查找/etc目录下大于1M且类型为普通文件的所有文件
1 find /etc -type f -a -size +1M
6、查找/etc目录下所有用户都没有写权限的文件
1 find /etc -not -perm /222
7、查找/etc目录下至少有一类用户没有执行权限的文件
1 find /etc -not -perm -111
8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
1 find /etc/init.d -perm -113
压缩和解压缩 主要针对单个文件压缩,而非目录。
一、compress 和 uncompress 格式
1 2 compress Options [file...] uncompress file.Z
常用选项
1 2 3 -d 解压缩,相当于 uncompress -c 结果输出至标准输出,不删除源文件 -v 显示详情
zcat file.Z 不解压缩的前提下查看文本的文件内容
二、gzip 和 gunzip 格式
常用选项
1 2 3 4 5 6 -k keep,保留源文件,centos8新特性 -d 解压缩,相当于gunzip -c 结果输出至标准输出,保留源文件 - zcat file.gz
三、bzip2 和 bunzip2 常用选项
1 2 3 4 5 6 7 -k keep,保留源文件,centos8新特性 -d 解压缩,相当于gunzip -c 结果输出至标准输出,保留源文件 - bzcat file.bz2
四、xz 和 unxz 常用选项
1 2 3 4 5 6 7 -k keep,保留源文件 -d 解压缩 -c 结果输出至标准输出,保留源文件不改变 - xzcat file.xz
zip 和 unzip zip 可以实现打包目录和多个文件成一个文件并压缩,但可能会丢失文件属性信息,如:所有者和组信息,一般建议使用 tar 代替。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [root@Rocky8-mini test ] 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
示例
1 2 3 4 5 6 7 8 9 10 11 [root@Rocky8-mini test ] [root@Rocky8-mini test ] [root@Rocky8-mini ~] [root@Rocky8-mini ~]
实例1:交互式加密和解密
1 2 3 4 5 6 7 8 9 10 11 12 [root@Rocky8-mini test ] 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 ] Archive: test.zip [test.zip] a b.txt password: extracting: /backup/a b.txt extracting: /backup/a.txt.bz2 extracting: /backup/b.txt
实例2:非交互式加密和解密
1 2 [root@Rocky8-mini test ] [root@Rocky8-mini test ]
打包和解包 一、tar tar 即磁带归档,可以对目录和多个文件打包成一个文件,并且可以压缩,保留文件属性不丢失,常用于备份功能。
选项:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 -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、创建归档,保留权限
1 2 tar -c -f -p /PATH/TO/SOMEFILE.tar FILE... tar -cpf /PATH/TO/SOMEFILE.tar FILE...
2、追加文件至归档,不支持对压缩文件追加
1 tar -rf /PATH/TO/SOMEFILE.tar FILE
3、查看归档文件中的文件列表
1 tar -t -f /PATH/TO/SOMEFILE.tar
4、展开归档
1 2 tar xf /PATH/TO/SOMEFILE.tar tar xf /PATH/TO/SOMEFILE.tar -C /PATH/TO/DIR
5、结合压缩工具实现归档并压缩
1 2 3 -z 相当于gzip压缩工具 -j 相当于bzip2 -J 相当于xz
示例
1 2 3 4 5 6 7 8 9 [root@Rocky8-mini ~] [root@Rocky8-mini ~] [root@Rocky8-mini ~] [root@Rocky8-mini ~] test.tar.bz2 test.tar.gz test.tar.xz [root@Rocky8-mini ~] [root@Rocky8-mini test ]
6、对文件进行归档压缩式,排除指定的文件
1 2 3 --exclude 排除文件 tar zcvf /root/test.tgz --exclude=/data/test/a.txt --exclude=/data/test/b.txt /data/test
7、选择指定的输入和选择要排除的文件列表
1 2 3 4 -T 选择指定的输入文件 -X 选择只当包含要排除的文件列表 tar zcvf backup.tgz -T /root/includefilelist -X /root/excludefilelist
二、split split 命令可以将一个文件分割成多个文件
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 [root@Rocky8-mini test ] 10+0 records in 10+0 records out 10485760 bytes (10 MB, 10 MiB) copied, 0.00859871 s, 1.2 GB/s [root@Rocky8-mini test ] [root@Rocky8-mini test ] 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 [root@Rocky8-mini test ] 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 ] [root@Rocky8-mini test ] -rw-r--r-- 1 root root 10M Mar 23 04:29 bigfile1
三、cpio cpio 是通过重定向的方式将文件进行打包备份、还原恢复的工具,它可以解压缩以“.cpio”和“.tar”结尾的文件
格式
1 2 cpio [option] > 文件名或设备名 cpio [option] < 文件名或设备名
常用选项
1 2 3 4 5 6 7 8 9 -o output模式,打包,将标准输入传入的文件名打包后发送到标准输出 -i input模式,解包,对标准输入传入的打包文件名解包到当前目录 -t 预览,查看标准输入传入的打包文件中包含的文件列表 -O filename 输出到指定的归档文件名 -A 向已存在的归档文件中追加文件 -I filename 对指定的归档文件名解压 -F filename 使用指定的文件名替代标准输入或输出 -d 解包生成目录,在cpio还原时,自动的建立目录 -v 显示打包过程中的文件名称
示例
1 2 3 4 5 6 7 8 9 10 11 [root@Rocky8-mini ~] [root@Rocky8-mini ~] [root@Rocky8-mini ~] [root@Rocky8-mini ~]