linux文件查找工具详解
linux文件查找详解
1.linux文件查找工具
1.1 find命令详解
find是一个实时查找文件的工具,功能强大,可以基于不同的维度对文件进行查找,例如名字,时间,权限,大小等,同时可以对查找到的文件执行某种动作。
find工作特点如下:
- 实时查找;
- 精确查找;
- 查找范围过大时查找速度较慢;
- 对于用户不具备读取和执行权限的目录find无法查找其下的内容;
find命令语法格式:
find [查找路径范围] [options] [查找条件表达式] [执行动作]
- [查找路径范围]:即find命令查找的目录范围,不写默认为当前路径,并且find会进行递归查找;
- [options] :按照何种文件属性进行查找;
- [查找条件表达式]:和选项部分共同完成文件的查找;
- [执行动作]:对查找到的文件执行何种动作;
1.1.1 根据文件名查找
-maxdepth:最大查找遍历的目录遍历深度
-mindepth:最小查找遍历的目录遍历深度
-name:按照文件名进行查找,文件名支持通配符;如果使用通配符,搜索的字符串需要使用双引号括起来
-iname:按照文件名进行查找,不区分大小写
#示例一:
[root@xuzhichao ~]# find /etc/ -name passwd
/etc/pam.d/passwd
/etc/passwd #示例二:指定查找层级
[root@xuzhichao ~]# find /etc/ -maxdepth 1 -name passwd
/etc/passwd #示例三:只查找特定层级的内容
[root@xuzhichao ~]# find /etc/ -maxdepth 2 -mindepth 2 -name passwd
/etc/pam.d/passwd #示例四:
[root@xuzhichao ~]# find /etc/ -maxdepth 1 -name "*.conf"
/etc/resolv.conf
/etc/libaudit.conf
...(省略部分内容)... #示例五:不区分大小写
[root@xuzhichao ~]# ll FILe1 file1
-rw-r--r-- 1 root root 0 May 24 10:37 FILe1
-rw-r--r-- 1 root root 7 May 24 10:37 file1
[root@xuzhichao ~]# find -iname "file1"
./FILe1
./file1
-inum:按照inode号查找文件
#示例:
[root@xuzhichao ~]# ll -i /etc/fstab
33554498 -rw-r--r--. 1 root root 465 Nov 4 2020 /etc/fstab
[root@xuzhichao ~]# find /etc/ -inum 33554498
/etc/fstab
-samefile FILENAME :查找与FILENAME相同inode号的文件
#示例:
[root@xuzhichao ~]# ln file1 file1_link
[root@xuzhichao ~]# ls -i file1 file1_link
67417303 file1 67417303 file1_link
[root@xuzhichao ~]# find . -samefile file1
./file1
./file1_link
-links :查找具备相同链接数的文件
#示例:查找硬链接数为2的文件
[root@xuzhichao ~]# find . -links 2 -ls
67160141 0 drwx------ 2 root root 48 Nov 4 2020 ./.dbus/session-bus
34177133 0 drwxr-xr-x 2 root root 6 Nov 4 2020 ./.config/abrt
67160143 0 drwxr-xr-x 2 root root 55 Nov 4 2020 ./.kde/share/config
-regex:使用正则表达式匹配整个文件路径字符串,而不仅仅是文件名。
注意:-regex参数会降低find的查找速度。
[root@xuzhichao ~]# find /etc/ -regex ".*\.conf$"
/etc/resolv.conf
/etc/fonts/conf.d/65-0-lohit-devanagari.conf
/etc/fonts/conf.d/61-urw-fallback-backwards.conf
1.1.2 根据属主属组查找
-user:查找属主为指定用户名的文件
-group:查找属组为指定组的文件
-uid:查找属主为指定uid的文件
-gid:查找属组为指定gid的文件
#示例一:查找文件属主为xu的文件
[root@xuzhichao ~]# find /home/ -user xu #示例二:查找文件属组xu的文件
[root@xuzhichao ~]# find /home/ -group xu #示例三:查找文件uid为1001,并且gid为1001的文件
[root@xuzhichao ~]# find /home/ -uid 1001 -gid 1001
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
#示例一:查找没有属主和属组的文件
[root@xuzhichao ~]# find /home/ -nouser -nogroup #示例二:查找没有属主或属组的文件
[root@xuzhichao ~]# find /home/ -nouser -o -nogroup
1.1.3 根据文件类型查找
-type:根据文件类型进行查找,可用文件类型如下:
- f:普通文件
- d:目录文件
- l:符号链接文件
- s:套接字文件
- c:字符设备文件
- b:块设备文件
- p:管道文件
#示例一:查找文件类型为普通文件
[root@xuzhichao ~]# find /etc/ -type f #示例二:查找目录
[root@xuzhichao ~]# find /etc/ -type d #示例二:查找软链接文件
[root@xuzhichao ~]# find /etc/ -type l
-empty:空的文件或目录
#示例一:查找空文件和目录
[root@xuzhichao test]# ll f1
-rw-r--r-- 1 root root 0 May 24 12:06 f1
[root@xuzhichao test]# ll dir1
total 0
[root@xuzhichao test]# find /data/test/ -empty
/data/test/f1
/data/test/dir1
1.1.4 根据文件大小查找
-size [+|-] #UNIT:
- UNIT:单位,常用单位:k,M,G,c(字节)
- #UNIT:取值范围为(#-1,#],如5k表示4k到5k大小之间,不包括4k
- #+UNIT:取值范围为(#,+∞],如+5k表示大于5k
- #-UNIT:取值范围为[0,#-1],如-5k表示小于等于5k
#示例一:查找文件大小为107字节的文件
[root@xuzhichao ~]# ll f1
-rw-r--r-- 1 root root 107 May 23 22:18 f1
[root@xuzhichao ~]# find /root/ -size 107c
/root/f1 #示例二:
[root@xuzhichao ~]# find /root/ -size 2k #示例三:
[root@xuzhichao ~]# find /root/ -size +10M
1.1.5 根据文件时间查找
-atime [+|-]#:以天为单位,对文件的访问时间进行查找。
- #:表示[#,#+1)天前,;例如3表示3到4天前的那一天
- -#:表示[0,#)天前,0表示当前时间,例如-3表示过去3天以内
- +#:表示[#+1,∞)天前,例如+3表示4天前
-ctime [+|-]#:以天为单位,对文件的属性修改时间进行查找。
-mtime [+|-]#:以天为单位,对文件的内容修改时间进行查找。
-amin [+|-]#:以分钟为单位,对文件的访问时间进行查找。
-cmin [+|-]#:以分钟为单位,对文件的属性修改时间进行查找。
-mmin [+|-]#:以分钟为单位,对文件的内容修改时间进行查找。
时间的逻辑图如下:
#创建24个不同日期的文件
[root@xuzhichao ~]# for i in {01..24} ;do cd /data/test;touch -d 202105$i file-$i;done
[root@xuzhichao test]# ll
total 0
-rw-r--r-- 1 root root 0 May 1 00:00 file-01
-rw-r--r-- 1 root root 0 May 2 00:00 file-02
-rw-r--r-- 1 root root 0 May 3 00:00 file-03
-rw-r--r-- 1 root root 0 May 4 00:00 file-04
-rw-r--r-- 1 root root 0 May 5 00:00 file-05
-rw-r--r-- 1 root root 0 May 6 00:00 file-06
-rw-r--r-- 1 root root 0 May 7 00:00 file-07
-rw-r--r-- 1 root root 0 May 8 00:00 file-08
-rw-r--r-- 1 root root 0 May 9 00:00 file-09
-rw-r--r-- 1 root root 0 May 10 00:00 file-10
-rw-r--r-- 1 root root 0 May 11 00:00 file-11
-rw-r--r-- 1 root root 0 May 12 00:00 file-12
-rw-r--r-- 1 root root 0 May 13 00:00 file-13
-rw-r--r-- 1 root root 0 May 14 00:00 file-14
-rw-r--r-- 1 root root 0 May 15 00:00 file-15
-rw-r--r-- 1 root root 0 May 16 00:00 file-16
-rw-r--r-- 1 root root 0 May 17 00:00 file-17
-rw-r--r-- 1 root root 0 May 18 00:00 file-18
-rw-r--r-- 1 root root 0 May 19 00:00 file-19
-rw-r--r-- 1 root root 0 May 20 00:00 file-20
-rw-r--r-- 1 root root 0 May 21 00:00 file-21
-rw-r--r-- 1 root root 0 May 22 00:00 file-22
-rw-r--r-- 1 root root 0 May 23 00:00 file-23
-rw-r--r-- 1 root root 0 May 24 00:00 file-24
[root@xuzhichao test]# date
Mon May 24 15:11:21 CST 2021
#示例一:查找5天前到6天前修改的文件
[root@xuzhichao test]# find /data/test/ -mtime 5
/data/test/file-19
#示例二:查找最近5天修改过的文件
[root@xuzhichao test]# find /data/test/ -mtime -5
/data/test/
/data/test/file-20
/data/test/file-21
/data/test/file-22
/data/test/file-23
/data/test/file-24
#示例三:查找6天前改动过的文件
[root@xuzhichao test]# find /data/test/ -mtime +5
/data/test/file-01
/data/test/file-02
/data/test/file-03
/data/test/file-04
/data/test/file-05
/data/test/file-06
/data/test/file-07
/data/test/file-08
/data/test/file-09
/data/test/file-10
/data/test/file-11
/data/test/file-12
/data/test/file-13
/data/test/file-14
/data/test/file-15
/data/test/file-16
/data/test/file-17
/data/test/file-18
#示例四:查找当天改动过的文件
[root@xuzhichao test]# find /data/test/ -mtime 0
[root@xuzhichao test]# find /data/test/ -mtime -1
/data/test/
/data/test/file-24
#示例五:查找最近一分钟内改动过的文件
[root@xuzhichao test]# find /data/test/ -mmin -1
1.1.6 根据文件权限查找
-perm [/|-] MODE:根据权限查找文件
- MODE:表示属主属组和其他人的权限都必须是MODE,例如666表示该文件属主属组和其他人的权限都必须是rw-
- -MODE:表示属主属组和其他人的权限都必须包含MODE,例如-666表示文件的属主属组和其他人的权限可以是rw-或rwx
- /MODE:表示属主属组和其他人的任意一个权限位含有MODE指定的权限即可,例如/666表示文件的属主属组和其他人权限只要有一个权限中有r,w其中一个即可,如r,w,rw,rwx,rx,wx
- 权限中的0表示不关心
#示例:
[root@xuzhichao test2]# ll
total 0
-rw-rw-rw- 1 root root 0 May 24 15:49 file1
-rwxrwxrwx 1 root root 0 May 24 15:49 file2
-rw-r--r-- 1 root root 0 May 24 15:49 file3
-r--r--r-- 1 root root 0 May 24 15:49 file4
---x--x--x 1 root root 0 May 24 15:49 file5
--wx-wx-wx 1 root root 0 May 24 15:53 file6
[root@xuzhichao test2]# find . -perm 666 -ls
67419906 0 -rw-rw-rw- 1 root root 0 May 24 15:49 ./file1
[root@xuzhichao test2]# find . -perm /666 -ls
67417311 0 drwxr-xr-x 2 root root 84 May 24 15:53 .
67419906 0 -rw-rw-rw- 1 root root 0 May 24 15:49 ./file1
67419934 0 -rwxrwxrwx 1 root root 0 May 24 15:49 ./file2
67420768 0 -rw-r--r-- 1 root root 0 May 24 15:49 ./file3
67420770 0 -r--r--r-- 1 root root 0 May 24 15:49 ./file4
67420773 0 --wx-wx-wx 1 root root 0 May 24 15:53 ./file6
[root@xuzhichao test2]# find . -perm -666 -ls
67419906 0 -rw-rw-rw- 1 root root 0 May 24 15:49 ./file1
67419934 0 -rwxrwxrwx 1 root root 0 May 24 15:49 ./file2
1.1.7 find逻辑运算符
-a:与,前后两个条件同时满足才匹配,默认同时出现多个查找条件时即为与关系
-o:或,脸厚两个条件满足一个即为匹配
-not,!:非,取反
!A -o !B = !(A -a B)。注意:括号需要使用\转义
!A -a !B = !(A -o B)
#示例一:查找以conf结尾的普通文件
[root@xuzhichao test2]# find /etc/ -name "*.conf" -type f #示例二:查找空的非普通文件
[root@xuzhichao test2]# find /etc/ -not -type f -empty #示例三:查找属主不是root,且文件名不以a开头的文件
[root@xuzhichao test2]# find /etc/ -not -user root -not -name "a*"
[root@xuzhichao test2]# find /etc/ -not \( -user root -o -name "a*" \) <==注意括号与命令之间需要有空格 #示例四:查找空的非普通类型的文件或软链接文件,括号的用法
[root@xuzhichao test2]# find /etc/ \( -not -type f -a -empty \) -o -type l
1.1.8 排除目录
或需要在查找文件时排除某个目录不查找,可以使用如下方法:
-path PATH -a -prune
#示例一:查找/etc下除了/etc/httpd目录的以conf结尾的文件
[root@xuzhichao test2]# find /etc/ -path "/etc/httpd" -a -prune -o name "*.conf"
#示例二:查找/etc下除了/etc/httpd和/etc/nginx目录的以conf结尾的文件
[root@xuzhichao test2]# find /etc/ \( -path "/etc/httpd" -o -path "/etc/nginx" \) -a -prune -o name "*.conf"
1.1.9 find的动作处理
find可以把查找到的文件执行不同的操作,常见操作如下:
-print:默认动作,结果直接输出到屏幕
-ls:对查找到的文件以长格式显示,类似于使用"ls -l"的显示结果
#示例:
[root@xuzhichao test2]# find /data/test2 -perm 666 -ls
67419906 0 -rw-rw-rw- 1 root root 0 May 24 15:49 ./file1
-print0:输出结果时,结果之间使用空字符串null代替换行符分隔
#示例:
[root@xuzhichao test2]# find . -perm /666 -print0
../file1./file2./file3./file4./file6[root@xuzhichao test2]#
-fls:查找到的文件的长格式信息保存到指定的文件中
#示例:
[root@xuzhichao test2]# find . -perm /666 -fls find.txt
[root@xuzhichao test2]# cat find.txt
67417311 0 drwxr-xr-x 2 root root 100 May 24 17:22 .
67419906 0 -rw-rw-rw- 1 root root 0 May 24 15:49 ./file1
67419934 0 -rwxrwxrwx 1 root root 0 May 24 15:49 ./file2
67420768 0 -rw-r--r-- 1 root root 0 May 24 15:49 ./file3
67420770 0 -r--r--r-- 1 root root 0 May 24 15:49 ./file4
67420773 0 --wx-wx-wx 1 root root 0 May 24 15:53 ./file6
67420774 0 -rw-r--r-- 1 root root 0 May 24 17:22 ./find.txt
-delete:删除查找到的文件
#示例:查找/var/log下最近10天的以.log结尾的文件
[root@xuzhichao test2]# find /var/log -type f -name "*.log" -mtime +10 -delete
-ok command {} ; :对查找到的文件执行command动作,执行前每个文件都会询问是否要执行
-exe command {} ; :对查找到的文件执行command动作,非交互式执行
#示例一:
[root@xuzhichao test2]# ll fs*
-rw-r--r-- 1 root root 465 May 24 17:30 fstab
[root@xuzhichao test2]# find -name "fs*" -ok rm -f {} \;
< rm ... ./fstab > ? y
[root@xuzhichao test2]# find -name "fs*" -exec rm -f {} \; #示例二:把fatab文件复制到/data/test2目录下
[root@xuzhichao test2]# find /etc/ -name "fstab" -exec cp {} /data/test2 \; #示例三:当执行复制文件并改名并且跨目录复制,需要在当前文件夹下搜索并且不带搜索目录名,
[root@xuzhichao test2]# find /etc/ -name "fstab" -exec cp {} /data/test2/{}.bak \;
cp: cannot create regular file '/data/test2//etc/fstab.bak': No such file or directory
[root@xuzhichao test2]# cd /etc/
[root@xuzhichao etc]# find -name "fstab" -exec cp {} /data/test2/{}.bak \;
1.1.10 find与grep,xargs结合使用
find命令和xargs命令结合使用示例如下:
#示例:查找文件并删除
[root@xuzhichao etc]# find /data/test2 -perm 666 | xargs rm -f
find命令和grep命令结合使用
find命令可以查找目录下的所有文件和目录,包括子目录内的文件目录,但是不能查找文件的具体内容。
grep命令可以查找某个目录下的所有文件的内容的关键字,但是不支持对文件名的查找。
两者配合使用可以使用xargs参数,查找子目录下的所有文件内容。
#示例:根据文件内容查找文件名
[root@xuzhichao ~]# find /etc/ -type f | xargs grep -R "Require all granted"
/etc/httpd/conf/httpd.conf: Require all granted
/etc/httpd/conf/httpd.conf: Require all granted
/etc/httpd/conf/httpd.conf: Require all granted
/etc/httpd/conf.d/autoindex.conf: Require all granted
/etc/httpd/conf.d/welcome.conf: Require all granted
1.2. xargs命令详解
1.2.1 xargs的作用
xargs的作用
管道可以将前一个命令的标准输出作为后一个命令的标准输入,但是有很多程序是不支持处理标准输入,例如 kill , rm ,ls这些程序如果命令行参数中没有指定要处理的内容则不会默认从标准输入中读取。xargs命令可以通过管道接受字符串,并将接收到的字符串通过空格分割成许多参数(默认情况下是通过空格分割) ,然后将参数传递给其后面的命令,作为后面命令的命令行参数,这样 kill , rm ,ls这些程序就可以处理标准输入了。
#示例:查找文件并删除
[root@xuzhichao etc]# find /data/test2 -perm 666 | xargs rm -f
xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入中的换行和空白通过 xargs 的处理,换行和空白将被空格取代。
#示例:
[root@xuzhichao ~]# seq 5 | xargs
1 2 3 4 5
[root@xuzhichao ~]# seq 5 | xargs | xargs -n1
1
2
3
4
5
xargs和管道的区别
以下面的例子进行说明:
可以看到 echo '--help' | cat 该命令输出的是echo的内容,也就是说将echo的内容当作cat处理的文件内容了,实际上就是echo命令的输出通过管道定向到cat的输入了。然后cat从其标准输入中读取待处理的文本内容。这等价于在test.txt文件中有一行字符 '--help' 然后运行 cat test.txt 的效果。
而 echo '--help' | xargs cat 等价于 cat --help ,就是xargs将其接受的字符串 --help 做成cat的一个命令参数来运行cat命令,同样 echo 'test1 test2' | xargs cat 等价于 cat test1c test2 此时会将test1和test2的内容都显示出来。
#示例:xargs和管道的执行结果
[root@xuzhichao ~]# echo "--help" | cat
--help
[root@xuzhichao ~]# echo "--help" | xargs cat
Usage: cat [OPTION]... [FILE]...
Concatenate FILE(s), or standard input, to standard output. -A, --show-all equivalent to -vET
-b, --number-nonblank number nonempty output lines, overrides -n
-e equivalent to -vE
-E, --show-ends display $ at end of each line
-n, --number number all output lines
-s, --squeeze-blank suppress repeated empty output lines
-t equivalent to -vT
-T, --show-tabs display TAB characters as ^I
-u (ignored)
-v, --show-nonprinting use ^ and M- notation, except for LFD and TAB
--help display this help and exit
--version output version information and exit With no FILE, or when FILE is -, read standard input. Examples:
cat f - g Output f's contents, then standard input, then g's contents.
cat Copy standard input to standard output. GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
Report cat translation bugs to <http://translationproject.org/team/>
For complete documentation, run: info coreutils 'cat invocation'
1.2.2 xargs的用法详解
xargs的常用选项如下,一一说明。
-d选项:默认情况下xargs将其标准输入中的内容以空白(包括空格、Tab、回车换行等)分割成多个之后当作命令行参数传递给其后面的命令,并运行之,可以使用 -d 命令指定分隔符。
#默认情况下以空白分割,那么00:01:7a:14:9d:e4这个字符串中没有空白,所以实际上等价于 echo 00:01:7a:14:9d:e4 其中字符串 '00:01:7a:14:9d:e4' 被当作echo命令的一个命令行参数。
#指定以:符号分割参数,所以等价于 echo 00:01:7a:14:9d:e4 相当于给echo传递了6个参数,分别是00 01 7a 14 9d e4。
指定以@符号分割参数,所以等价于 echo 11 22 33 相当于给echo传递了3个参数,分别是11、22、33。
[root@xuzhichao ~]# echo "00:01:7a:14:9d:e4" |xargs
00:01:7a:14:9d:e4
[root@xuzhichao ~]# echo "00:01:7a:14:9d:e4" |xargs -d :
00 01 7a 14 9d e4
-n 选项:该选项表示将xargs生成的命令行参数,每次传递几个参数给其后面的命令执行。
例如如果xargs从标准输入中读入内容,然后以分隔符分割之后生成的命令行参数有10个,使用 -n 3 之后表示一次传递给xargs后面的命令是3个参数,因为一共有10个参数,所以要执行4次,才能将参数传完。
该选项还可以解决某些命令无法处理太多参数的问题,例如rm命令
#示例一:一行变多行
[root@xuzhichao ~]# echo {1..10} | xargs -n 2
1 2
3 4
5 6
7 8
9 10
[root@xuzhichao ~]# echo {1..10} | xargs -n 3
1 2 3
4 5 6
7 8 9
10 #创建1000000个文件并删除
[root@xuzhichao test2]# touch file{1..1000000}
-bash: /usr/bin/touch: Argument list too long <==提示参数过长
#可以实现如下方法创建,一次传递给touch10000个参数进行处理
[root@xuzhichao test2]# echo file{1..1000000} | xargs -n 10000 touch [root@xuzhichao test2]# rm -f file{1..1000000}
-bash: /usr/bin/rm: Argument list too long <==提示参数过长
#可以实现如下方法删除,一次传递给rm100个参数进行处理
[root@xuzhichao test2]# echo file{1..1000000} | xargs -n 100 rm -f
-0 选项:表示以 '\0' 为分隔符,一般与find的-print0结合使用。
#示例:
[root@xuzhichao etc]# find /etc/ -name "*.conf" -print0 | xargs -0 wc -l
3 /etc/resolv.conf
153 /etc/fonts/conf.d/65-0-lohit-devanagari.conf
136 /etc/fonts/conf.d/61-urw-fallback-backwards.conf
77 /etc/fonts/conf.d/65-0-jomolhari.conf
18 /etc/fonts/conf.d/31-cantarell.conf
16 /etc/fonts/conf.d/60-overpass.conf
31 /etc/fonts/conf.d/59-liberation-sans.conf
48 /etc/fonts/conf.d/65-0-madan.conf
xargs默认使用空格作为分隔符,当文件名中存在空格时会有问题,此时可以使用-0改变分隔符。
#示例:
[root@xuzhichao test2]# touch "a b.txt"
[root@xuzhichao test2]# touch "a b.sh"
[root@xuzhichao test2]# ll
total 0
-rw-r--r-- 1 root root 0 May 24 19:41 a b.sh
-rw-r--r-- 1 root root 0 May 24 19:41 a b.txt [root@xuzhichao test2]# find /data/test2/ -name "a b*" | xargs ls -l
ls: cannot access /data/test2/a: No such file or directory <==出现报错
ls: cannot access b.txt: No such file or directory
ls: cannot access /data/test2/a: No such file or directory
ls: cannot access b.sh: No such file or directory [root@xuzhichao test2]# find /data/test2/ -name "a b*" -print0 | xargs -0 ls -l
-rw-r--r-- 1 root root 0 May 24 19:41 /data/test2/a b.sh
-rw-r--r-- 1 root root 0 May 24 19:41 /data/test2/a b.txt [root@xuzhichao test2]# find /data/test2/ -name "a b*" -print0 | xargs -0 rm
-rw-r--r-- 1 root root 0 May 24 19:41 /data/test2/a b.sh
-rw-r--r-- 1 root root 0 May 24 19:41 /data/test2/a b.txt
-p选项:使用该选项之后xargs并不会马上执行其后面的命令,而是输出即将要执行的完整的命令(包括命令以及传递给命令的命令行参数),询问是否执行,输入 y 才继续执行,否则不执行。
这种方式可以清楚的看到执行的命令是什么样子,也就是xargs传递给命令的参数是什么。
#示例:
[root@xuzhichao test2]# echo "00:01:7a:14:9d:e4" |xargs -p -d :
echo 00 01 7a 14 9d e4
?...y <==提示是否执行,输入y才执行
00 01 7a 14 9d e4
-E 选项:该选项指定一个字符串,当xargs解析出多个命令行参数的时候,如果搜索到-E指定的命令行参数,则只会将-E指定的命令行参数之前的参数(不包括-e指定的这个参数)传递给xargs后面的命令。
注意:-E只有在xargs不指定-d的时候有效,如果指定了-d则不起作用,而不管-d指定的是什么字符,空格也不行。
[root@xuzhichao test2]# echo "11 22 33" | xargs -E "33"
11 22
[root@xuzhichao test2]# echo '11@22@33@44@55@66@77@88@99@00 aa 33 bb' | xargs -E '33' -d '@' -p
echo 11 22 33 44 55 66 77 88 99 00 aa 33 bb
?...y
11 22 33 44 55 66 77 88 99 00 aa 33 bb
1.3 locate命令详解
locate命令也可以查找系统上的文件,和find命令不同,locate是需要先建立文件的索引,然后通过索引来查找文件,类似于书的目录,因此查找速度较快。
locate的查找特点如下:
- 查找速度快;
- 模糊查找;
- 非实时查找,因为系统的索引在未建立时,是查找不到文件的;
- 查找的是文件的全路径,不仅仅是文件名;
- 对于用户不具备读取和执行权限的目录find无法查找其下的内容;
locate的目录索引文件为/var/lib/mlocate/mlocate.db,在没有此文件时无法使用locate进行查找。
mlocate.db索引文件有两种创建方法:
系统通过计划任务每天周期性的自动创建,周期性文件为/etc/cron.daily/mlocate
[root@xuzhichao test2]# ll /etc/cron.daily/mlocate
-rwx------. 1 root root 208 Apr 11 2018 /etc/cron.daily/mlocate
[root@xuzhichao test2]# cat /etc/cron.daily/mlocate
#!/bin/sh
nodevs=$(awk '$1 == "nodev" && $2 != "rootfs" && $2 != "zfs" { print $2 }' < /proc/filesystems) renice +19 -p $$ >/dev/null 2>&1
ionice -c2 -n7 -p $$ >/dev/null 2>&1
/usr/bin/updatedb -f "$nodevs"
使用updatedb命令手动创建
[root@xuzhichao test2]# updatedb
[root@xuzhichao test2]# ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 3212333 May 24 20:16 /var/lib/mlocate/mlocate.db
updatedb命令有对应的配置文件/etc/updatedb.conf
[root@xuzhichao test2]# cat /etc/updatedb.conf
PRUNE_BIND_MOUNTS = "yes"
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fuse.sshfs fusectl gfs gfs2 gpfs hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs fuse.glusterfs ceph fuse.ceph"
PRUNENAMES = ".git .hg .svn"
PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache/ccache /var/lib/yum/yumdb /var/spool/cups /var/spool/squid /var/tmp /var/lib/ceph"
- PRUNE_BIND_MOUNTS:yes代表目录索引不扫描挂载点下的内容
- PRUNEFS:代表此类文件系统不会被目录索引扫描
- PRUNENAMES:代表此类文件名后缀的文件
- PRUNEPATHS:代表此类路径下的内容不会被目录索引扫描
locate命令的常用选项如下:
选项 说明 -i 不区分大小写查找 -n # 只列举前#个匹配项目 -r 正则表达式 --regex 扩展正则表达式 -b 只匹配基名,默认为匹配全路径 -c 显示匹配文件的总数量 #示例一:默认文件的路径中含有查找内容也会被匹配
[root@xuzhichao test2]# locate sysconfig
/etc/sysconfig
/etc/sysconfig/anaconda
/etc/sysconfig/atd
/etc/sysconfig/authconfig
...(省略部分内容)... #示例二:仅查找基名
[root@xuzhichao test2]# locate -b sysconfig
/etc/sysconfig
...(省略部分内容)... #示例三:仅显示匹配到的次数
[root@xuzhichao test2]# locate -c sysconfig
101
[root@xuzhichao test2]# locate sysconfig | wc -l
101 #示例四:仅显示匹配到的前两个匹配项
[root@xuzhichao test2]# locate -n 2 sysconfig
/etc/sysconfig
/etc/sysconfig/anaconda
[root@xuzhichao test2]# locate -l 2 sysconfig
/etc/sysconfig
/etc/sysconfig/anaconda #示例五:使用正则表达式查找以conf结尾的文件,比一般的查找要精确
[root@xuzhichao test2]# locate -r "\.conf$"
再次重申:locate命令时根据/var/lib/mlocate/mlocate.db文件创建的目录索引进行查找文件的,虽然查找速度比较快,但是如果新建立的文件,还没有加入mlocate.db文件之前是无法被查找到的,此时则需要使用find命令进行查找了。
linux文件查找工具详解的更多相关文章
- Linux 文件查找命令详解
find命令 Linux find命令用来在指定目录下查找文件.任何位于参数之前的字符串都将被视为欲查找的目录名.如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件.并且将 ...
- Linux 文件/目录操作详解
目录 Linux 文件/目录操作详解 初识Linux 一.文件/目录显示命令 ls 二.目录创建命令 mkdir 三.目录转移命令 cd 四.当前目录显示命令 pwd 五.文件处理命令 rmdir 六 ...
- Linux文件查找工具之find “大宝剑”--转载
原文地址:http://xinzong.blog.51cto.com/10018904/1749465 一.文件查找工具常用软件 locate: locate命令其实是find -name的另一种写法 ...
- Linux文件传输FTP详解
ftp命令用来设置文件系统相关功能.ftp服务器在网上较为常见,Linux ftp命令的功能是用命令的方式来控制在本地机和远程机之间传送文件,这里详细介绍Linux ftp命令的一些经常使用的命令,相 ...
- linux文件查找工具——locate,find
一文件查找介绍 文件的查找就是在文件系统上查找符合条件的文件. 文件查找的方式:locate, find非实时查找也就是基于数据库查找的locate,效率特别高. 实时查找:find 二locate ...
- Linux 文件特殊权限详解[suid/sgid/t]
setuid(suid): 针对命令和二进制程序的,当普通用户执行某个(passwd)命令的时候,可以拥有这个命令对应用户的权限, 即让普通用户可以以root用户的角色执行程序或命令. setgid( ...
- linux文件系統详解
什么是文件系统 文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构,即在存储设备(磁盘)上组织文件的方法.操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统. 从系统角 ...
- Linux 文件描述符详解
Overview 了解Linux怎样处理输入和输出是非常重要的.一旦我们了解其原理以后,我们就可以正确熟练地使用脚本把内容输出到正确的位置.同样我们也可以更好地理解输入重定向和输出重定向. Linux ...
- linux命令-tar工具详解
把文件和目录打成一个包 文件打包 [root@wangshaojun ~]# tar -cvf 1.tar 1.txt 123 234 ///-c创建 -v可视化 -f file放最后面1.txt12 ...
- linux 文件记录锁详解
一: linux记录锁更恰当的称呼应该是范围锁,它是对文件某个范围的锁定. 关于记录锁的功能就是fcntl提供的第五个功能,具体使用如下: int fcntl(int fd, int cmd, str ...
随机推荐
- archlinux xfce 设置窗口背景颜色,QT背景颜色
1.使用xfce主题 2.有QT背景不覆盖,使用配置 sudo pacman -S qt5-ct 3.在/etc/environment添加环境变量 QT_QPA_PLATFORMTHEME=qt5c ...
- Android弹出UI界面---Toast
1.默认展示 1 // 第一个参数:当前的上下文环境.可用getApplicationContext()或this 2 // 第二个参数:要显示的字符串.也可是R.string中字符串ID 3 // ...
- Minlexes题解
\(\texttt{Problem Link}\) 简要题意 在一个字符串 \(s\) 中,对于每个后缀,任意删掉一些相邻的相同的字符,使得字符串字典序最小. 注意:删掉之后拼起来再出现的相邻相同字符 ...
- SpringSecurity认证和授权流程详解
什么是SpringSecurity Spring Security是一个Java框架,用于保护应用程序的安全性.它提供了一套全面的安全解决方案,包括身份验证.授权.防止攻击等功能.Spring Sec ...
- 04 jQuery遍历器
04 jQuery遍历器 如果jQuery一次性选择了很多元素节点. 而我们又希望能拿到每一个元素中的相关信息. 此时可以考虑用jQuery的遍历器来完成对元素的循环遍历. 例如: <!DOCT ...
- 开源图形驱动在OpenHarmony上的使用和落地
本文转载自 OpenHarmony TSC 官方微信公众号<峰会回顾第10期 | 开源图形驱动在OpenHarmony上的使用和落地> 演讲嘉宾 | 黄 然 回顾整理 | 廖 ...
- 从入门到精通:C++ 学习路线指南,附详细学习计划
C++是一种高级编程语言,广泛用于开发操作系统.应用程序.游戏和各种工具.如果你想学习这门语言,以下是一个适合初学者的学习路线: 第一步:学习C++基础知识 在学习C++之前,你需要掌握一些基础知识, ...
- Visual Studio 2022插件的安装及使用 - 编程手把手系列文章
这次开始写手把手编程系列文章,刚写到C#的Dll程序集类库的博文,就发现需要先介绍Visual Studio 2022的插件的安装及使用,因为在后面编码的时候会用到这些个插件,所以有必要先对这个内容进 ...
- openGauss资源池化开发者入门指南(二)
openGauss 资源池化开发者入门指南(二) 一.内容简介 openGauss 资源池化是 openGauss 推出的一种新型的集群架构.通过 DMS 和 DSS 组件,实现集群中多个节点的底层存 ...
- 编程小白也能快速掌握的ArkUI JS组件开发
原文:https://mp.weixin.qq.com/s/ByxCMvtxaNuKI_6cXgtLBg,点击链接查看更多技术内容. Playground自上线以来,得到了广大开发者的一致好评.特别是 ...