龙空技术网

Linux 下如何快速查找文件?

guoguodelu 155

前言:

如今朋友们对“ubuntu下如何打包文件路径”可能比较着重,兄弟们都需要知道一些“ubuntu下如何打包文件路径”的相关内容。那么小编同时在网上搜集了一些关于“ubuntu下如何打包文件路径””的相关文章,希望咱们能喜欢,朋友们一起来了解一下吧!

最近清理容器镜像仓库,需要查找异常的link和data文件,但是镜像仓库使用量已经到达几十T,那么查找文件的效率则很重要的。

linux下查找文件有哪些方式?

首先想到的方式肯定是find方案,虽然find提供了大量强大而有用的选项,但是find是单线程查找文件,达不到想要的效率;mlocate包提供的locateupdatedb命令集,先通过updatedb创建索引,locate命令来查找文件,对于新增文件必须要先updatedb,对于镜像仓库实时性也是有一定的要求,locate的输出结果不可控;fd是一种简单又快速和用户友好的find替代方案.,fd相对于find更简洁,而且是支持多线程查询文件,只是官网上没有找到对CentOS7使用yum或者rpm来安装。下面就对几个工具来做简单的介绍来解决日常场景需求。

github有针对find和fd的使用hyperfine()进行平均和统计分析。

01 fd工具

安装

由于经常使用是CentOS7,但是官网上没有CentOS7的安装,只能下载tar包来安装,官网下载链接。

fd_version='v8.3.0'rust_library='musl'wget ;$fd_version"/fd-"$fd_version"-x86_64-unknown-linux-"$rust_library".tar.gztar -xzvf fd-"$fd_version"-x86_64-unknown-linux-"$rust_library".tar.gzcd fd-"$fd_version"-x86_64-unknown-linux-"$rust_library"cp -p fd /usr/local/sbin/chmod +x /usr/local/sbin/fd

fd --version fd 8.3.0是2021年11月最近版本。

在Linux操作系统上编译Rust程序时设置的方式。 x86_64-unknown-linux-gnu 是动态依赖,目标服务器需要包含动态依赖的相关库(用户共享库)。没有相应库会又类似报错fd: /lib64/libc.so.6: version `GLIBC_2.18' not found (required by fd)。 x86_64-unknown-linux-musl 是静态依赖,目标服务器不需要包含相应的库,但是打包文件会更大些,使用会方便些。

CentOS8和Ubuntu等源来安装fd

# dnf install fd-find# apt install fd-find
使用
# fd [标志/选择] [搜索内容]  [搜索路径]# fd -hfd 8.3.0USAGE:    fd [FLAGS/OPTIONS] [<pattern>] [<path>...]    ## fd之后可以不接任何参数,就只检索当前目录所有目录和文件FLAGS:    -H, --hidden            Search hidden files and directories   ##搜索隐藏的文件和目录,默认是不搜索。    -I, --no-ignore         Do not respect .(git|fd)ignore files  ##不忽略搜索文件'.gitignore'/'.ignore'/'.fdignore'    -s, --case-sensitive    Case-sensitive search (default: smart case) ##区分大小写搜索,默认是不区分大小写    -i, --ignore-case       Case-insensitive search (default: smart case)  ##不区分大小写搜索    -g, --glob              Glob-based search (default: regular expression) ## 执行基于全名称的搜索,而不是正则表达式搜索    -a, --absolute-path     Show absolute instead of relative paths  ##显示绝对路径,默认是相对路径    -l, --list-details      Use a long listing format with file metadata ##显示文件的原信息,类似ls -l;-a和-l不能一起使用,否则会报错    -L, --follow            Follow symbolic links  ##默认情况下, fd 不会进入符号链接目录。使用这个标志,符号链接也被遍历    -p, --full-path         Search full abs. path (default: filename only) ##默认情况下,搜索模式仅与文件名(或目录名)匹配。使用此标志,模式与完整(绝对)路径匹配。    -h, --help              Prints help information ## 帮助,-h是简单介绍,--help是详细介绍    -V, --version           Prints version information  ##查看版本OPTIONS:    -d, --max-depth <depth>            Set maximum search depth (default: none)  ##搜索目录深度,1是当前目录    -t, --type <filetype>...           Filter by type: file (f), directory (d), symlink (l),                                       executable (x), empty (e), socket (s), pipe (p)  ##这个参数很有用,文件类型,包括文件/目录/链接/可以执行文件/空文件/socket文件/pipe文件    -e, --extension <ext>...           Filter by file extension  ##这个参数可以很有用,按文件扩展名过滤搜索结果。可以指定多个允许的文件扩展名。类似 *.sh  *.jgp。    -x, --exec <cmd>                   Execute a command for each search result ##对每个搜索结果并行执行一个命令(使用 --threads=1 顺序执行命令)    -X, --exec-batch <cmd>             Execute a command with all search results at once  ## 执行一次给定的命令,将所有搜索结果作为参数。    -E, --exclude <pattern>...         Exclude entries that match the given glob pattern ## 不包括全名称搜索    -c, --color <when>                 When to use colors: never, *auto*, always ## 显示颜色,默认是auto    -S, --size <size>...               Limit results based on the size of files  ##按照文件大小查找,支持-小于和+大于,支持k/m/g/t等单位        --changed-within <date|dur>    Filter by file modification time (newer than) ## 小于某个时间点修改的搜索,支持s,m,d,M,y        --changed-before <date|dur>    Filter by file modification time (older than) ## 大于某个时间点的修改搜索    -o, --owner <user:group>           Filter by owning user and/or group  ##按照拥有者和所属组搜索ARGS:    <pattern>    the search pattern (a regular expression, unless '--glob' is used; optional)  ## 要搜索的内容    <path>...    the root directory for the filesystem search (optional) ##检索目录Note: `fd -h` prints a short and concise overview while `fd --help` gives all details.

常用标志:-s -a -l 常用选项:-t -e -x --size

-j, --threads <num> 设置用于搜索和执行的线程数(默认值:可用 CPU 内核数)

查看线程信息

cat /proc/`pgrep fd|tail -1`/status |grep Threads
实例创建测试文件
mkdir -p /root/test-lu-fdcd /root/test-lu-fdmkdir abc 123touch abc1234.sh abc1234.jpgtouch 123.sh 123.jpgtouch abc.sh abc.jpgtouch ABC.sh ABC.jpg
实例命令
# fd --type f abc -j 10ABC.jpgABC.shabc.jpgabc.shabc1234.jpgabc1234.sh# fd --type f -s abc   ## 小sabc.jpgabc.shabc1234.jpgabc1234.sh# fd -e sh123.shABC.shabc.shabc1234.sh# fd -e jpg -l -rw-r----- 1 root root 0 Dec 31 14:36 ./123.jpg-rw-r----- 1 root root 0 Dec 31 14:36 ./abc1234.jpg-rw-r----- 1 root root 0 Dec 31 14:37 ./abc.jpg-rw-r----- 1 root root 0 Dec 31 14:37 ./ABC.jpg# fd -e jpg -a/root/test-lu-fd/123.jpg/root/test-lu-fd/ABC.jpg/root/test-lu-fd/abc.jpg/root/test-lu-fd/abc1234.jpg# fd --type f -e sh 123123.shabc1234.sh# fd --type f -e sh 123 -x mv {} {.}.txt# fd --type f -e txt 123123.txtabc1234.txt

'{}': path (of the current search result) 路径(当前搜索结果的) '{/}': basename 基本名称 '{//}': parent directory 父目录 '{.}': path without file extension 没有文件扩展名的路径 '{/.}': basename without file extension 没有文件扩展名的基本名称

02 mlocate工具集

locate命令类似命令find -name,但是比find快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db。

安装

locate命令通过该updatedb命令生成的数据库文件搜索给定的模式。找到的结果显示在屏幕上,每行显示一个。

# yum install -y mlocate# rpm -ql mlocate |grep bin/usr/bin/locate/usr/bin/updatedb
使用
Usage: updatedb [OPTION]...Usage: locate [OPTION]... [PATTERN]...

命令使用比较简单,一般update不加参数直接运行即可,locate加上搜索内容即可

实例

# updatedb # ll -h /var/lib/mlocate/mlocate.db-rw-r----- 1 root slocate 6.2M Jan  4 12:51 /var/lib/mlocate/mlocate.db# locate 123.jpg/root/test-lu-fd/123.jpg# locate -c 12352

locate不能指定路径查询。

03 find工具

find是最常用的工具之一,find很强大,它可以查找文件名、文件类型、文件大小,文件时间,文件权限,文件主和组,以及文件系统等,基本只要想要查找的部分,基本都是可以使用find来完成。

GNU Findutils 4.8.0

安装

# yum install findutils -y# rpm -ql findutils |grep bin/usr/bin/find/usr/bin/oldfind/usr/bin/xargs
使用
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]# [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] 这些很少使用# [path] 指定路径,这个比locate要友好些,如果不指定就是查当前路径# [expression] 这个是比较灵活,是find的核心部分,包括四个部分:operators, options, tests, and actions。其中tests和actions是最常用部分。
实例operators
# find / -mtime +10 -a -size +1G

查找大于10天(不包括第10天)并且大于1G的文件。

非 ! EXPR -not EXPR

与 EXPR1 -a EXPR2 EXPR1 -and EXPR2 默认选项

或 EXPR1 -o EXPR2 EXPR1 -or EXPR2 EXPR1 , EXPR2

options

# find /  -maxdepth 3  -name test

选择options要在测试tests之前,常用 -maxdepth LEVELS -mindepth LEVELS 。

options: -depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf --version -xautofs -xdev -ignore_readdir_race -noignore_readdir_race

tests

在find的tests中使用n的含义:+n 大于n,-n小于n,n刚好等于n。

-cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME-ilname PATTERN -iname PATTERN -inum N -iwholename PATTERN -iregex PATTERN-links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE-nouser -nogroup -path PATTERN -perm [-/]MODE -regex PATTERN-readable -writable -executable-wholename PATTERN -size N[bcwkMG] -true -type [bcdpflsD] -uid N-used N -user NAME -xtype [bcdpfls]-context CONTEXT
名称

文件,-name pattern:文件名查找,支持正则 -iname pattern:不区分大小写

路径, -path pattern: 路径名称 -wholename pattern: 整个路径 -ipath pattern -iwholename pattern 查找目录很少使用

# find / -name \*.sh -size +100k -ls

注:匹配文件test\.\* \*test\是转义。

文件类型

-type c: 文件类型 b:块设备(有缓存) c:字符设备(无缓存) d:目录 p:命令管道(FIFO) f:常规文件 l:符号链接 s:socket

# find /etc -type d -empty
符号链接

软连接,-lname pattern:符号链接 -ilname pattern:不区分大小符号链接 -type l

硬链接,-samefile NAME 搜索文件相同inode号的文件 -inum n:搜索inode号为n的文件 -links n:文件有 n 个硬链接,也可-n或者+n

# find / -samefile /root/test-lu.info
文件大小

-size n[cwbkMG]: 文件大小 k:KiB以1024字节为单位,M:MiB,G:GiB,b:512 字节块(从不 1024)c:字节,w:2个字节 -empty:空文件或者目录

# find / -size +1G 
时间

时间范围,时间稍微复杂些,access(访问),change(修改文件名称或者属性),modify(修改文件内容);

天:-atime -ctime -mtime(0是“小于24小时”,1是“24-48小时之间”)

分钟:-amin -cmin -mtime 时间以天为单位:

-daystart 从今天开始而不是从 24 小时前开始测量时间

对比时间戳-newerXY reference XY可以是a(访问) c(改变名称或者属性) m(修改内容) t(时间) -newerXt是有有效的,但是-newertY是无效的;

-used n 如果文件最后一次访问是在其状态最后更改n天后,则为True。 -newer reference 如果当前文件的上次访问(或状态更改或数据修改)的时间比参考文件的上次数据修改的时间更近,则为真。

# find /var  -mmin +20  -mmin -60# find /etc/ -newermt "2022-01-01"
所属者和组

所属者:-user uname 所有者,-uid n 所有者的UID,可以通过/etc/passwd或id命令查到用户的UID。注:n可以是范围+n或者-n。-nouser 没有所有者与UID对应

所属组:-group gname 所有组,-gid n 所有组的GID,-nogroup 没有组与GID相对应

# find / -uid +1000

用户UID的值: 0系统管理员;1-100内的UID约定预留给系统使用,有些手册则推荐在此基础上再预留101~499(如RHEL[2])甚至是101~999(如Debian[1])的UID以作备用;1000+一般使用者使用即自建用户,在Linux中用useradd命令创建第一个用户时,默认为之分配的UID则为1000。

权限

权限查找相对其他查找相对复杂些,本身linux权限也是相对的复杂的部分,总的来说设置权限的原则是最小权限。

u:user g:group o:other a:all users等同ugo

+:添加权限 -:删减权限 =:直接赋权将会覆盖现有权限

r:可读权限 w:可写权限 x:执行权限

条目

readable

writable

executable

文件

读取阅读文件内容的权限

表示具有新增、修改文件内容的权限;

有执行文件的权限

目录

有浏览目录的权限

修改目录内文件的权限

有进入目录的权限

-readable: 可读权限 -writable: 可写权限 -executable: 可执行权限

-perm pmode: 以-或者/为前缀,来配置权限。注:不能以+符号为前缀。- : 是完全匹配 /:是任意匹配,只要有任意权限配置则输出。

# find /etc/ -perm -777# find /etc/ -perm -a+x ! -perm -g+w  -type f

查找所有用户有执行权权限,但是所属组没有写权限的文件

文件系统

-fstype type: 文件类型查找,文件类型有:autofs ext3 ext4 fuse.sshfs nfs proc sshfs sysfs ufs tmpfs xfs。一般使用较少。

# find / -fstype  nfs
actions

有时候是需要对查找的内容进行处理,actions就提供这个功能。

打印名称

-print: 在标准输出整个文件名,后面在换行,默认是参数 -print0: 在标准输出整个文件名,但是不换行,很少使用 -fprint file:将搜索结果输出文件中,包含换行。如果在运行find时文件不存在,它将被创建;如果它存在,将会覆盖。-fprint0 file: 没有换行将结果输出到文件中。

# find / -name test\.\*  -fprint  /tmp/find-printf.ifo
打印文件信息

-ls: 搜索的结果信息显示,相当于命令ls -dils -fls file: 将查找的结果输出到指定文件中 -printf format 格式输出,常用于shell脚本 -fprintf file format 按照格式输出到某个文件中

# find / -size +10G -printf "file-size:%s  file-name:%p\n"# find / -name test\.\*  -ls 4419330    4 -rw-r-----   1 root     root          112 Dec 13 17:25 /root/test.info

-ls输出信息:inode号,1024B(1K)块的数量,文件权限,文件硬链接数量,所属者,所属组,最后修改时间,文件名称

-printf中比较有用的参数,\n换行,\ttab分割,%p 包括绝对路径的文件名,%s 文件大小单位bytes(B),%k 文件大小(单位KB)相当于%s/1024,%m文件权限类似644格式,%f 只有文件名没有路径

运行命令

单个文件(串行运行命令,一次对一个文件运行命令):-execdir command ; : 单个目录操作 -exec command ; : 单个文件操作 注:;结尾符号不要遗漏,而且linux命令是以;分隔,需要使用\来转义,即以\;结尾

多个文件(并行运行命令):-execdir command {} + : 多个目录操作 -exec command {} + :多个文件操作 注:+结尾符号不要遗漏,最好使用\+转义。

询问命令是否执行:-okdir command ; :类似-execdir,不过询问是否继续命令 -ok command ; : 类似-exec 注:以\;结尾

# time find /root/ -name 123\.\* -exec ls -l {} +
删除文件

-delete 删除文件或者目录,谨慎使用

#  find /root/ -name 123.txt.sl -delete
限制

-prune: 如果查询到文件是一个目录,请不要进入目录 -quit 匹配立即停止 这两个参数比较难理解,创建个实例就好理解了。

# mkdir -p /tmp/test# touch /tmp/test/test   /tmp/test.sh# find /tmp -name "test*" -prune/tmp/test/tmp/test.sh# find /tmp -name "test*"  -print -quit/tmp/test

使用-prune匹配到/tmp/test目录就不会在进入/tmp/test目录内继续查找;-quit 前需要加-print,否则是没有输出,个人感觉整个比较设置名称完全匹配,来提高查询效率。

On my way!

标签: #ubuntu下如何打包文件路径 #ubuntu统计文件数量 #ubuntu中查找文件 #centos过滤查询文件内容 #linux查看so依赖