目录

前言

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命令基础讲解的更多相关文章

  1. Linux实战教学笔记04:Linux命令基础

    第四节:Linux命令基础 标签(空格分隔):Linux实战教学笔记 第1章 认识操作环境 root:当前登陆的用户名 @分隔符 chensiqi:主机名 -:当前路径位置 用户的提示符 1.1 Li ...

  2. docker-compose初试及命令基础

    转自:https://www.cnblogs.com/jsonhc/p/7811929.html 以一个简单的lnmp.yaml的配置文件进行讲解docker-compose命令的基础讲解,熟练掌握命 ...

  3. Linux常用命令精华讲解 上部 (下部下回分解)不要催很忙的

    Linux常用命令讲解 1.Linux命令基础 2.Linux命令帮助 3.目录与文件的基操 1.Shell是系统中运行的一种特殊程序在用户和内核之间充当"翻译官"的角色,登录li ...

  4. Java程序设计的DOS命令基础

    Java程序设计的DOS命令基础 用户使用操作系统和软件有两种方式:命令行界面(Command Line Interface,CLI)和图形界面(Graphical User Interface,GU ...

  5. 北大,awk 命令基础练习

    北大,awk 命令基础练习 Red Hat Enterprise Linux Version 5.3 Get the latest news about the world's Open Source ...

  6. Verilog语法基础讲解之参数化设计

    Verilog语法基础讲解之参数化设计   在Verilog语法中,可以实现参数化设计.所谓参数化设计,就是在一个功能模块中,对于一个常量,其值在不同的应用场合需要设置为不同的置,则将此值在设计时使用 ...

  7. 原生AJAX基础讲解及兼容处理

    原文:原生AJAX基础讲解及兼容处理 AJAX = Asynchronous JavaScript and XML (异步的JavaScript和XML). AJAX不是新技术 ,但却是热门的技术.它 ...

  8. JavaScript继承基础讲解,原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承

    说好的讲解JavaScript继承,可是迟迟到现在讲解.废话不多说,直接进入正题. 既然你想了解继承,证明你对JavaScript面向对象已经有一定的了解,如还有什么不理解的可以参考<面向对象J ...

  9. Android学习笔记-Adapter基础讲解

    本节引言 从本节开始我们要讲的UI控件都是跟Adapter(适配器)打交道的,了解并学会使用这个Adapter很重要, Adapter是用来帮助填充数据的中间桥梁,简单点说就是:将各种数据以合适的形式 ...

随机推荐

  1. /etc/profile /etc/bashrc ~/.bash_profile ~/.bashrc ~/.bash_logout 说明及区别

    /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置. /etc/bashrc:为每一 ...

  2. Django 学习笔记(三)模板导入

    本章内容是将一个html网页放进模板中,并运行服务器将其展现出来. 平台:windows平台下Liunx子系统 目前的目录: hello ├── manage.py ├── hello │ ├── _ ...

  3. adb 安装apk 报错:Failure [INSTALL_FAILED_INVALID_URI]

    今天在安装某apk的时候,发现报错 报错信息:Failure [INSTALL_FAILED_INVALID_URI] 于是找到了一个解决方式: cmd命令行下执行以下命令: 第一步.adb remo ...

  4. C++ 用lambda代替 unique_ptr 的Deleter

    C++ 用lambda代替 unique_ptr 的Deleter 代码 #include <iostream> #include <cstdlib> #include < ...

  5. Day1 - 服务器硬件基础

    1.1 关于运维人员 1.1.1 运维的职责 1.保证服务器7*24小时 运行 2.保证数据不能丢 3.提高用户的体验(网站打开的速度) 1.1.2 运维原则 简单.易用.高效  === 简单.粗暴 ...

  6. OpenID Connect:OAuth 2.0协议之上的简单身份层

    OpenID Connect是什么?OpenID Connect(目前版本是1.0)是OAuth 2.0协议(可参考本人此篇:OAuth 2.0 / RCF6749 协议解读)之上的简单身份层,用 A ...

  7. input长度随输入内容动态变化 input光标定位在最右侧

    <input type="text" onkeydown="this.onkeyup();" onkeyup="this.size=(this. ...

  8. WebApi Ajax 跨域请求解决方法(CORS实现)(作者:jianxuanbing)

    概述 ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.但是在使用API的时候总会遇到跨域请求的问题,特别各 ...

  9. CSS3动画效果之transition

    CSS3中有两种方式实现动画,transition和animation+@keyframe. 两者的作用机制不一样:transition定义在可能要进行动画的元素上,对某些CSS属性进行监听,一旦CS ...

  10. 转:【深入Java虚拟机】之三:类初始化

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17845821 类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Jav ...