find命令基础讲解
目录
前言
find命令
查找条件
指定搜索层级
根据文件名和inode查找
根据属名属主查找
根据文件类型查找
组合条件
根据文件大小查找
根据时间戳查找
根据权限查找
动作处理
参数替换xargs
扩展
基于数据库的查找locate
前言
我们的操作系统都是由千千万万个文件组成的,当我们访问某个文件时,如果是在windows操作系统下,由于此操作系统对文件明名后缀的定义的功能十分严格,所以我们很容易就能在Windows下找到我们所需要的文件。即便是文件过于错综复杂,我们依旧可以在图形化的Windows下通过固定的文件后缀查找我们所需要的文件。
但是在linux下情况不是那么乐观,因为在linux下对文件名后缀是没有要求的,文件可以是任何后缀名,这对执行或浏览并没有任何问题。这也就造成了文件查找的不便,但是有一点好处是,在linux下有很多查找工具,我们可以借助工具锁定文件的某一特性进行查找,这里面的我们要说一说“find”命令。
find是一种实时查找工具,它可以通过便利指定路径完成文件的查找,它的特点是:查找速度略慢,精确查找,实时查找,只能搜索用户具备读取和执行权限的目录。
find命令
格式:find [option] [查找路径] [查找条件] [处理动作]
查找路径:指定具体路径,默认为当前目录
查找条件:指定查找标准,可以是文件名,大小,类型,权限等,默认为找出指定路径下的所有文件
处理动作:对符合条件的文件操作,默认输出到屏幕
查找条件
指定搜索层级
我们在查找文件时,知道文件并不是放在某个很层级很多的目录中,此时我们可以限定搜索的层级,在一定的层级范围内所搜我们想要查找的文件。
-maxdepth level 最大搜索目录深度,指定目录为第1级
-mindepth level 最小搜索目录深度
[root@CT71 etc]#find -maxdepth | less
……
./fonts/conf.d/--lohit-marathi.conf
./fonts/conf.d/-liberation-mono.conf
./fonts/conf.d/-ucs-miscfixed.conf
./fonts/conf.d/-liberation-sans.conf
./fonts/conf.d/-open-sans.conf
./fonts/conf.d/-scale-bitmap-fonts.conf
./fonts/conf.d/--madan.conf
./fonts/conf.d/-unhint-small-vera.conf
……
[root@CT71 etc]#find -mindepth | less
./pki/ca-trust/extracted/README
./pki/ca-trust/extracted/java
./pki/ca-trust/extracted/java/README
./pki/ca-trust/extracted/java/cacerts
./pki/ca-trust/extracted/openssl
根据文件名和inode查找
同时,我们如果知道文件名或inode号,还可以通过文件名或inode号查找查找。
-name "文件名称":支持使用glob(通配符):*, ?, [], [^]
-iname "文件名称":不区分字母大小写
-inum n 按inode号查找
-samefile name 相同inode号的文件
-links n 链接数为n的文件
-regex 支持正则 默认为(emacs标准)
-regextype egrep -regex 支持egrep同标准的正则
[root@CT71 etc]#find -name "fstab"
./fstab
[root@CT71 etc]#ll -i fstab
-rw-r--r--. root root Jul : fstab
[root@CT71 etc]#find -inum
./fstab
[root@CT71 app]#find -samefile tty1
./tty1
./tty2
[root@CT71 app]#ll -i
total
-rw-r--r--. root root Aug : tty1
-rw-r--r--. root root Aug : tty2
[root@CT71 app]#find -links
.
./tty1
./tty2
[root@CT71 app]#find -regextype egrep -regex ".*\.txt$"
./lianxi_123.txt
根据属主、属组查找
-user USERNAME:查找属主为指定用户(UID)的文件
-group GRPNAME: 查找属组为指定组(GID)的文件
-uid UserID:查找属主为指定的UID号的文件
-gid GroupID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
[root@CT71 app]#find / -user Tom
/home/Tom
/home/Tom/.mozilla
/home/Tom/.mozilla/extensions
/home/Tom/.mozilla/plugins
/home/Tom/.bash_logout
/home/Tom/.bash_profile
/home/Tom/.bashrc
[root@CT71 app]#find /home/ -group Tom
/home/Tom
/home/Tom/.mozilla
/home/Tom/.mozilla/extensions
/home/Tom/.mozilla/plugins
/home/Tom/.bash_logout
[root@CT71 app]#find /home/ -uid
/home/Tony
/home/Tony/.mozilla
/home/Tony/.mozilla/extensions
/home/Tony/.mozilla/plugins
/home/Tony/.bash_logout
/home/Tony/.bash_profile
根据文件类型查找
-type TYPE:
f : 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
[root@CT71 app]#find / -type l | less
/dev/disk/by-label/CentOS\x207\x20x86_64
/dev/disk/by-uuid/------
/dev/disk/by-uuid/8c59579c-30fb-417a-9fd2-cc0dd58d261e
/dev/disk/by-uuid/0292b8be-15bb-4b5a-87e3-01519be7c6de
......
[root@CT71 app]#find / -type b | less
/dev/sda5
/dev/sda4
/dev/sda3
/dev/sda2
/dev/sda1
/dev/sda
/dev/sr0
组合条件
与:-a
或:-o
非:-not,!
摩根定律:
(!A)-o(!B) == ! (A –a B)
(!A)-a(!B) == ! (A –o B)
示例:
find -user joe -not -group joe
find -user joe -o -user jane
find -not \( -user joe -o -user jane \)
find / -user joe -o -uid 500
find ./ -path './dir0*' -a -prune -o -name *.txt -print
命令行的意思是:如果目录dir0存在(即-a左边为真),则求-prune的值,-prune 返回真,‘与’逻辑表达式为真(即-path './dir0*' -a -prune 为真),find命令将在除这个目录以外的目录下查找txt后缀文件并打印出来;如果目录dir0不存在(即-a左边为假),则不求值-prune ,‘与’逻辑表达式为假,则在当前目录下查找所有txt后缀文件。
在我的机器上,我想查找在根下既所有者即不是root也不是Tom的文件
[root@CT71 ~]#find / ! \( -user root -o -user Tom \) -ls
drwxr-xr-x qemu qemu Aug : /dev/hugepages/libvirt/qemu
dr-xr-xr-x dbus dbus Aug : /proc/
dr-xr-xr-x dbus dbus Aug : /proc//task
dr-xr-xr-x dbus dbus Aug : /proc//task/
dr-xr-xr-x dbus dbus Aug : /proc//task//attr
dr-xr-xr-x dbus dbus Aug : /proc//task/
dr-xr-xr-x dbus dbus Aug : /proc//task//attr
dr-xr-xr-x dbus dbus Aug : /proc//net
dr-xr-xr-x dbus dbus Aug : /proc//attr
dr-xr-xr-x polkitd polkitd Aug : /proc/
dr-xr-xr-x polkitd polkitd Aug : /proc//task
dr-xr-xr-x polkitd polkitd Aug : /proc//task/
dr-xr-xr-x polkitd polkitd Aug : /proc//task//attr
dr-xr-xr-x polkitd polkitd Aug : /proc//task/
dr-xr-xr-x polkitd polkitd Aug : /proc//task//attr
在上面的试验中,我们有需要注意的地方,那就是括号,我们需要给它进行转译,否则,find命令无法识别。还有就是括号内两侧要留空格,不然不能使用。后面的-ls是我们在下面会说到的动作处理。在这里我们先使用一下,-ls的作用是列出文件的信息。
根据文件大小来查找
-size [+|-]#UNIT
常用单位:k, M, G,c(byte)
#UNIT: (#-1, #]如:6k 表示(5k,6k]
-#UNIT:[0,#-1]如:-6k 表示[0,5k]
+#UNIT:(#,∞)如:+6k 表示(6k,∞)
[root@CT71 bin]#find /var -size +10M
/var/lib/rpm/Packages
/var/cache/yum/x86_64//base/gen/primary_db.sqlite
/var/cache/yum/x86_64//base/gen/filelists_db.sqlite
/var/cache/yum/x86_64//updates/gen/primary_db.sqlite
/var/cache/yum/x86_64//updates/gen/filelists_db.sqlite
[root@CT71 app]#ll -h
total 33M
-rw-r--r--. root root 4.5M Aug : vm
-rw-r--r--. root root 27M Aug : vmA
[root@CT71 app]#find -size 5M ----------------------------------------------- 找大于4M小于5M的文件
./vm
[root@CT71 app]#find -size 27M ----------------------------------------------- 找大于26M小于27M的文件
./vmA
[root@CT71 app]#ll vmA
-rw-r--r--. root root Aug : vmA ----------------------------------- 27M = 28311522k
[root@CT71 app]#
根据时间戳查找
根据时间戳:
以“天”为单位;
-atime [+|-]#,
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-mtime
-ctime
以“分钟”为单位:
-amin
-mmin
-cmin

我们要查找某一天的文件,就是指从某一天的凌晨到这一天结束前的文件,我们也可以在时间后面加上其他条件,以增加查找的精度。
[root@CT71 app]#touch date{..}.txt
[root@CT71 app]#ll
total
-rw-r--r--. root root Aug : date1.txt
-rw-r--r--. root root Aug : date2.txt
-rw-r--r--. root root Aug : date3.txt
-rw-r--r--. root root Aug : date4.txt
-rw-r--r--. root root Aug : date5.txt
-rw-r--r--. root root Aug : date6.txt
-rw-r--r--. root root Aug : date7.txt
[root@CT71 app]#touch -t 201708071231 date3.txt
[root@CT71 app]#stat date3.txt
File: ‘date3.txt’
Size: Blocks: IO Block: regular empty file
Device: 803h/2051d Inode: Links:
Access: (/-rw-r--r--) Uid: ( / root) Gid: ( / root)
Context: unconfined_u:object_r:default_t:s0
Access: 2017-08-07 12:31:00.000000000 +0800
Modify: -- ::00.000000000 +
Change: -- ::31.127117025 +
Birth: -
[root@CT71 app]#touch -t 201708071131 date4.txt
[root@CT71 app]#stat date4.txt
File: ‘date4.txt’
Size: Blocks: IO Block: regular empty file
Device: 803h/2051d Inode: Links:
Access: (/-rw-r--r--) Uid: ( / root) Gid: ( / root)
Context: unconfined_u:object_r:default_t:s0
Access: 2017-08-07 11:31:00.000000000 +0800
Modify: -- ::00.000000000 +
Change: -- ::50.962118411 +
Birth: -
-----------------------------------------------------------------------------------------
[root@CT71 app]#find . -atime 2
./date3.txt
./date4.txt
我们查找到了两天以前访问过的文件,但是不包括第二天,也就是从三天前的凌晨到第二天之前的文件。上面是使用的atime做的实验,换成mtime或者amin效果是一样的,这里就不在做过多的演示。
根据权限查找
-perm [/|-]MODE
MODE: 精确权限匹配
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系
+ 从centos7开始淘汰
-MODE:每一类对象都必须同时拥有指定权限,与关系
0 表示不关注
示例:
find -perm 755 会匹配权限模式恰好是755的文件
只要当任意人有写权限时, find -perm +222就会匹配
只有当每个人都有写权限时, find -perm -222才会匹配
只有当其它人(other)有写权限时, find -perm -002才会匹配
首先是精确匹配权限:
[root@CT71 etc]#find . -perm -ls
-r-------- root root Jul : ./openldap/certs/password
[root@CT71 etc]#find . -perm -ls
---------- root root Aug : ./gshadow
---------- root root Aug : ./shadow
---------- root root Aug : ./gshadow-
---------- root root Aug : ./shadow-
然后是,只要ugo任何一位任何一种权限可以匹配得上就可以:我们可以看到匹配到的文件在u位上都有r权限
[root@CT71 etc]#find . -perm / -ls | less
drwxr-xr-x root root Aug : .
-rw-r--r-- root root Jul : ./fstab
-rw------- root root Jul : ./crypttab
lrwxrwxrwx root root Aug : ./mtab -> /proc/self/mounts
-rw-r--r-- root root Aug : ./resolv.conf
drwxr-xr-x root root Jul : ./fonts
drwxr-xr-x root root Jul : ./fonts/conf.d
lrwxrwxrwx root root Jul : ./fonts/conf.d/--lohit-marathi.conf -> /usr/share/fontconfig/conf.avail/--lohit-marathi.conf
lrwxrwxrwx root root Jul : ./fonts/conf.d/-liberation-mono.conf -> /usr/share/fontconfig/conf.avail/-liberation-mono.conf
lrwxrwxrwx root root Jul : ./fonts/conf.d/-ucs-miscfixed.conf -> /usr/share/fontconfig/conf.avail/-ucs-miscfixed.conf
lrwxrwxrwx root root Jul : ./fonts/conf.d/-liberation-sans.conf -> /usr/share/fontconfig/conf.avail/-liberation-sans.conf
lrwxrwxrwx root root
接下来必须匹配的权限,也就是说:我要的权限你必须的匹配得到,其他我没有匹配到的,可以有,也可以没有.
[root@CT71 etc]#find . -perm - -ls | less
lrwxrwxrwx root root Aug : ./mtab -> /proc/self/mounts
lrwxrwxrwx root root Jul : ./fonts/conf.d/--lohit-marathi.conf -> /usr/share/fontconfig/conf.avail/--lohit-marathi.conf
lrwxrwxrwx root root Jul : ./fonts/conf.d/-liberation-mono.conf -> /usr/share/fontconfig/conf.avail/-liberation-mono.conf
lrwxrwxrwx root root Jul : ./fonts/conf.d/-ucs-miscfixed.conf -> /usr/share/fontconfig/conf.avail/-ucs-miscfixed.conf
lrwxrwxrwx root root Jul : ./fonts/conf.d/-liberation-sans.conf -> /usr/share/fontconfig/conf.avail/-liberation-sans.conf
lrwxrwxrwx root root Jul : ./fonts/conf.d/-open-sans.conf -> /usr/share/fontconfig/conf.avail/-open-sans.conf
lrwxrwxrwx root root Jul : ./fonts/conf.d/-scale-bitmap-fonts.conf -> /usr/share/fontconfig/conf.avail/-scale-bitmap-fonts.conf
lrwxrwxrwx root root Jul : ./fonts/conf.d/--madan.conf -> /usr/share/fontconfig/conf.avail/--madan.conf
lrwxrwxrwx root root Jul : ./fonts/conf.d/-unhint-small-vera.conf -> /usr/share/fontconfig/conf.avail/-unhint-small-vera.conf
动作处理
-print:默认的处理动作,显示至屏幕
-ls:类似于对查找到的文件执行“ls -l”命令
-delete:删除查找到的文件
-fls file:查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
{}: 用于引用查找到的文件名称自身
find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令
动作处理很简单啦,就是处理我们find查找到的文件进行后续的处理,接下来我们对动作处理做简单演示
[root@CT71 etc]#find . -atime -ls
-rw-r--r-- root root Nov ./pki/tls/openssl.cnf
-rw-r--r-- root root Nov ./ssh/ssh_config
-rw-r--r-- root root Aug : ./bashrc
-rw-r--r-- root root Aug : ./profile
-rw-r--r-- root root Aug : ./vimrc
-rw-r--r-- root root Jun ./services
[root@CT71 etc]#find . -atime 1 -fls /app/dadas$(date +"%F")
[root@CT71 etc]#cd /app/
[root@CT71 app]#ll
total 4
-rw-r--r--. 1 root root 2193 Aug 10 09:42 dadas2017-08-10
[root@CT71 app]#find . -name "dat*"
./date1.txt
./date2.txt
./date3.txt
./date4.txt
./date5.txt
./date6.txt
./date7.txt
[root@CT71 app]#find . -name "dat*" -ok rm {} \;
< rm ... ./date1.txt > ? y
< rm ... ./date2.txt > ? y
< rm ... ./date3.txt > ? y
< rm ... ./date4.txt > ? y
< rm ... ./date5.txt > ? y
< rm ... ./date6.txt > ? y
< rm ... ./date7.txt > ? y
参数替换
由于很多命令不支持管道|来传递参数,而日常工作中有这个必要,所以就有了xargs命令。xargs用于产生某个命令的参数, xargs 可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分隔成为arguments。有些命令不能接受过多参数,命令执行可能会失败, xargs可以解决
find和xargs格式: find | xargs COMMAND
示例:
ls f* |xargs rm
find /sbin -perm +7000 | xargs ls –l
[root@CT71 app]#find -name "data*" | xargs ls -li
-rw-r--r--. root root Aug : ./datas_a1.txt
-rw-r--r--. root root Aug : ./datas_a2.txt
-rw-r--r--. root root Aug : ./datas_a3.txt
-rw-r--r--. root root Aug : ./datas_a4.txt
-rw-r--r--. root root Aug : ./datas_b1.txt
-rw-r--r--. root root Aug : ./datas_b2.txt
-rw-r--r--. root root Aug : ./datas_b3.txt
-rw-r--r--. root root Aug : ./datas_b4.txt
-rw-r--r--. root root Aug : ./datas_c1.txt
-rw-r--r--. root root Aug : ./datas_c2.txt
-rw-r--r--. root root Aug : ./datas_c3.txt
-rw-r--r--. root root Aug : ./datas_c4.txt
扩展
基于数据库的查找
locate这个命令是基于数据库查找我们所需要的文件的,它没有很多的参数,不能像find那样进行基于某一方面的精确查找。使用locate查找文件,其实就是查找系统上预建的文件索引数据库/var/lib/mlocate/mlocate.db,由于它依赖于事先构建的索引,而索引的构建是在系统较为空闲时自动进行的,所以,我们在当时新建的文件或目录以及更新无法在当时使用locate查询,如果想要查询,需要手动更新数据库(updatedb)。
并且,索引构建过程需要遍历整个根文件系统,及消耗资源,它有以下工作特点:
查找速度快,模糊查找,非实时查询,搜索的是文件的全路径不仅仅是文件名,可能只搜索用户具备读取和执行权限的目录
命令:locate
选项:
-i:不区分大小写搜索
-n N:只列举前N个匹配项目
-r:使用正则搜索
[root@CT71 app]#locate /etc/ -i "*shad*" | less
/etc/.pwd.lock
/etc/.updated
/etc/DIR_COLORS
/etc/DIR_COLORS.256color
/etc/DIR_COLORS.lightbgcolor
/etc/GREP_COLORS
/etc/GeoIP.conf
... ...
[root@CT71 app]#locate -r ".*a\.conf$" | less
/etc/pbm2ppa.conf
/etc/pnm2ppa.conf
/etc/abrt/abrt-action-save-package-data.conf
/etc/fonts/conf.d/-unhint-small-vera.conf
/etc/fonts/conf.d/-no-bitmap-fedora.conf
/etc/fonts/conf.d/--lohit-kannada.conf
/etc/fonts/conf.d/--lohit-oriya.conf
/etc/fonts/conf.d/--smc-meera.conf
/etc/fonts/conf.d/-sil-abyssinica.conf
/etc/java/java.conf
... ...
find命令基础讲解的更多相关文章
- Linux实战教学笔记04:Linux命令基础
第四节:Linux命令基础 标签(空格分隔):Linux实战教学笔记 第1章 认识操作环境 root:当前登陆的用户名 @分隔符 chensiqi:主机名 -:当前路径位置 用户的提示符 1.1 Li ...
- docker-compose初试及命令基础
转自:https://www.cnblogs.com/jsonhc/p/7811929.html 以一个简单的lnmp.yaml的配置文件进行讲解docker-compose命令的基础讲解,熟练掌握命 ...
- Linux常用命令精华讲解 上部 (下部下回分解)不要催很忙的
Linux常用命令讲解 1.Linux命令基础 2.Linux命令帮助 3.目录与文件的基操 1.Shell是系统中运行的一种特殊程序在用户和内核之间充当"翻译官"的角色,登录li ...
- Java程序设计的DOS命令基础
Java程序设计的DOS命令基础 用户使用操作系统和软件有两种方式:命令行界面(Command Line Interface,CLI)和图形界面(Graphical User Interface,GU ...
- 北大,awk 命令基础练习
北大,awk 命令基础练习 Red Hat Enterprise Linux Version 5.3 Get the latest news about the world's Open Source ...
- Verilog语法基础讲解之参数化设计
Verilog语法基础讲解之参数化设计 在Verilog语法中,可以实现参数化设计.所谓参数化设计,就是在一个功能模块中,对于一个常量,其值在不同的应用场合需要设置为不同的置,则将此值在设计时使用 ...
- 原生AJAX基础讲解及兼容处理
原文:原生AJAX基础讲解及兼容处理 AJAX = Asynchronous JavaScript and XML (异步的JavaScript和XML). AJAX不是新技术 ,但却是热门的技术.它 ...
- JavaScript继承基础讲解,原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承
说好的讲解JavaScript继承,可是迟迟到现在讲解.废话不多说,直接进入正题. 既然你想了解继承,证明你对JavaScript面向对象已经有一定的了解,如还有什么不理解的可以参考<面向对象J ...
- Android学习笔记-Adapter基础讲解
本节引言 从本节开始我们要讲的UI控件都是跟Adapter(适配器)打交道的,了解并学会使用这个Adapter很重要, Adapter是用来帮助填充数据的中间桥梁,简单点说就是:将各种数据以合适的形式 ...
随机推荐
- /etc/profile /etc/bashrc ~/.bash_profile ~/.bashrc ~/.bash_logout 说明及区别
/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置. /etc/bashrc:为每一 ...
- Django 学习笔记(三)模板导入
本章内容是将一个html网页放进模板中,并运行服务器将其展现出来. 平台:windows平台下Liunx子系统 目前的目录: hello ├── manage.py ├── hello │ ├── _ ...
- adb 安装apk 报错:Failure [INSTALL_FAILED_INVALID_URI]
今天在安装某apk的时候,发现报错 报错信息:Failure [INSTALL_FAILED_INVALID_URI] 于是找到了一个解决方式: cmd命令行下执行以下命令: 第一步.adb remo ...
- C++ 用lambda代替 unique_ptr 的Deleter
C++ 用lambda代替 unique_ptr 的Deleter 代码 #include <iostream> #include <cstdlib> #include < ...
- Day1 - 服务器硬件基础
1.1 关于运维人员 1.1.1 运维的职责 1.保证服务器7*24小时 运行 2.保证数据不能丢 3.提高用户的体验(网站打开的速度) 1.1.2 运维原则 简单.易用.高效 === 简单.粗暴 ...
- OpenID Connect:OAuth 2.0协议之上的简单身份层
OpenID Connect是什么?OpenID Connect(目前版本是1.0)是OAuth 2.0协议(可参考本人此篇:OAuth 2.0 / RCF6749 协议解读)之上的简单身份层,用 A ...
- input长度随输入内容动态变化 input光标定位在最右侧
<input type="text" onkeydown="this.onkeyup();" onkeyup="this.size=(this. ...
- WebApi Ajax 跨域请求解决方法(CORS实现)(作者:jianxuanbing)
概述 ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.但是在使用API的时候总会遇到跨域请求的问题,特别各 ...
- CSS3动画效果之transition
CSS3中有两种方式实现动画,transition和animation+@keyframe. 两者的作用机制不一样:transition定义在可能要进行动画的元素上,对某些CSS属性进行监听,一旦CS ...
- 转:【深入Java虚拟机】之三:类初始化
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17845821 类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Jav ...