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.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!