前言:
如今朋友们对“ubuntu下如何打包文件路径”可能比较着重,兄弟们都需要知道一些“ubuntu下如何打包文件路径”的相关内容。那么小编同时在网上搜集了一些关于“ubuntu下如何打包文件路径””的相关文章,希望咱们能喜欢,朋友们一起来了解一下吧!最近清理容器镜像仓库,需要查找异常的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()进行平均和统计分析。
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 nfsactions
有时候是需要对查找的内容进行处理,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,否则是没有输出,个人感觉整个比较设置名称完全匹配,来提高查询效率。
标签: #ubuntu下如何打包文件路径 #ubuntu统计文件数量 #ubuntu中查找文件 #centos过滤查询文件内容 #linux查看so依赖