百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Linux 下如何快速查找文件? linux中怎样查找文件

bigegpt 2024-10-12 06:04 12 浏览

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

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

  • 首先想到的方式肯定是find方案,虽然find提供了大量强大而有用的选项,但是find是单线程查找文件,达不到想要的效率;
  • mlocate包提供的locateupdatedb命令集,先通过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大牛,所以我也只能一步步自己去...