Linux 下如何快速查找文件? linux中怎样查找文件
bigegpt 2024-10-12 06:04 12 浏览
最近清理容器镜像仓库,需要查找异常的link和data文件,但是镜像仓库使用量已经到达几十T,那么查找文件的效率则很重要的。
linux下查找文件有哪些方式?
- 首先想到的方式肯定是find方案,虽然find提供了大量强大而有用的选项,但是find是单线程查找文件,达不到想要的效率;
- mlocate包提供的locate和updatedb命令集,先通过updatedb创建索引,locate命令来查找文件,对于新增文件必须要先updatedb,对于镜像仓库实时性也是有一定的要求,locate的输出结果不可控;
- fd是一种简单又快速和用户友好的find替代方案.,fd相对于find更简洁,而且是支持多线程查询文件,只是官网上没有找到对CentOS7使用yum或者rpm来安装。下面就对几个工具来做简单的介绍来解决日常场景需求。
github有针对find和fd的使用hyperfine(https://github.com/sharkdp/hyperfine)进行平均和统计分析。
01 fd工具
安装
由于经常使用是CentOS7,但是官网上没有CentOS7的安装,只能下载tar包来安装,官网下载链接。
fd_version='v8.3.0'
rust_library='musl'
wget https://github.com/sharkdp/fd/releases/download/"$fd_version"/fd-"$fd_version"-x86_64-unknown-linux-"$rust_library".tar.gz
tar -xzvf fd-"$fd_version"-x86_64-unknown-linux-"$rust_library".tar.gz
cd 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 -h
fd 8.3.0
USAGE:
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-fd
cd /root/test-lu-fd
mkdir abc 123
touch abc1234.sh abc1234.jpg
touch 123.sh 123.jpg
touch abc.sh abc.jpg
touch ABC.sh ABC.jpg
实例命令
# fd --type f abc -j 10
ABC.jpg
ABC.sh
abc.jpg
abc.sh
abc1234.jpg
abc1234.sh
# fd --type f -s abc ## 小s
abc.jpg
abc.sh
abc1234.jpg
abc1234.sh
# fd -e sh
123.sh
ABC.sh
abc.sh
abc1234.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 123
123.sh
abc1234.sh
# fd --type f -e sh 123 -x mv {} {.}.txt
# fd --type f -e txt 123
123.txt
abc1234.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 123
52
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,否则是没有输出,个人感觉整个比较设置名称完全匹配,来提高查询效率。
相关推荐
- Go语言泛型-泛型约束与实践(go1.7泛型)
-
来源:械说在Go语言中,Go泛型-泛型约束与实践部分主要探讨如何定义和使用泛型约束(Constraints),以及如何在实际开发中利用泛型进行更灵活的编程。以下是详细内容:一、什么是泛型约束?**泛型...
- golang总结(golang实战教程)
-
基础部分Go语言有哪些优势?1简单易学:语法简洁,减少了代码的冗余。高效并发:内置强大的goroutine和channel,使并发编程更加高效且易于管理。内存管理:拥有自动垃圾回收机制,减少内...
- Go 官宣:新版 Protobuf API(go pro版本)
-
原文作者:JoeTsai,DamienNeil和HerbieOng原文链接:https://blog.golang.org/a-new-go-api-for-protocol-buffer...
- Golang开发的一些注意事项(一)(golang入门项目)
-
1.channel关闭后读的问题当channel关闭之后再去读取它,虽然不会引发panic,但会直接得到零值,而且ok的值为false。packagemainimport"...
- golang 托盘菜单应用及打开系统默认浏览器
-
之前看到一个应用,用go语言编写,说是某某程序的windows图形化客户端,体验一下发现只是一个托盘,然后托盘菜单的控制面板功能直接打开本地浏览器访问程序启动的webserver网页完成gui相关功...
- golang标准库每日一库之 io/ioutil
-
一、核心函数概览函数作用描述替代方案(Go1.16+)ioutil.ReadFile(filename)一次性读取整个文件内容(返回[]byte)os.ReadFileioutil.WriteFi...
- 文件类型更改器——GoLang 中的 CLI 工具
-
我是如何为一项琐碎的工作任务创建一个简单的工具的,你也可以上周我开始玩GoLang,它是一种由Google制作的类C编译语言,非常轻量和快速,事实上它经常在Techempower的基准测...
- Go (Golang) 中的 Channels 简介(golang channel长度和容量)
-
这篇文章重点介绍Channels(通道)在Go中的工作方式,以及如何在代码中使用它们。在Go中,Channels是一种编程结构,它允许我们在代码的不同部分之间移动数据,通常来自不同的goro...
- Golang引入泛型:Go将Interface「」替换为“Any”
-
现在Go将拥有泛型:Go将Interface{}替换为“Any”,这是一个类型别名:typeany=interface{}这会引入了泛型作好准备,实际上,带有泛型的Go1.18Beta...
- 一文带你看懂Golang最新特性(golang2.0特性)
-
作者:腾讯PCG代码委员会经过十余年的迭代,Go语言逐渐成为云计算时代主流的编程语言。下到云计算基础设施,上到微服务,越来越多的流行产品使用Go语言编写。可见其影响力已经非常强大。一、Go语言发展历史...
- Go 每日一库之 java 转 go 遇到 Apollo?让 agollo 来平滑迁移
-
以下文章来源于GoOfficialBlog,作者GoOfficialBlogIntroductionagollo是Apollo的Golang客户端Apollo(阿波罗)是携程框架部门研...
- Golang使用grpc详解(golang gcc)
-
gRPC是Google开源的一种高性能、跨语言的远程过程调用(RPC)框架,它使用ProtocolBuffers作为序列化工具,支持多种编程语言,如C++,Java,Python,Go等。gR...
- Etcd服务注册与发现封装实现--golang
-
服务注册register.gopackageregisterimport("fmt""time"etcd3"github.com/cor...
- Golang:将日志以Json格式输出到Kafka
-
在上一篇文章中我实现了一个支持Debug、Info、Error等多个级别的日志库,并将日志写到了磁盘文件中,代码比较简单,适合练手。有兴趣的可以通过这个链接前往:https://github.com/...
- 如何从 PHP 过渡到 Golang?(php转golang)
-
我是PHP开发者,转Go两个月了吧,记录一下使用Golang怎么一步步开发新项目。本着有坑填坑,有错改错的宗旨,从零开始,开始学习。因为我司没有专门的Golang大牛,所以我也只能一步步自己去...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- libcrypto.so (74)
- linux安装minio (74)
- ubuntuunzip (67)
- vscode使用技巧 (83)
- secure-file-priv (67)
- vue阻止冒泡 (67)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)