`
redalx
  • 浏览: 178716 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

find命令的笔记

阅读更多
Linux find 命令是所有 Linux 命令中最有用的一个,同时也是最混乱的一个。它很难,因为它的语法与其他 Linux 命令的标准语法不同。但是,它很强大,因为它允许您按文件名、文件类型、用户甚至是时间戳查找文件。使用 find 命令,您不但可以找到具这些属性任意组合的文件,还可以对它找到的文件执行操作。我经常发现有朋友在问这个命令的使用方法,自己有些时候也记不清楚。所以在网上找来了一些资料记在这里备查

首先将常用的一些选项列在下面:
Linux中find常见用法示例

·find path -option [ -print ] [ -exec -ok command ] {} \;
#-print 将查找到的文件输出到标准输出
#-exec command {} \;     -----将查到的文件执行command操作,{} 和 \;之间有空格
#-ok 和-exec相同,只不过在操作前要询用户

====================================================

-name filename             #查找名为filename的文件
-perm                       #按执行权限来查找
-user   username            #按文件属主来查找
-group groupname            #按组来查找
-mtime -n +n               #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime   -n +n              #按文件访问时间来查GIN: 0px">-perm                        #按执行权限来查找
-user   username            #按文件属主来查找
-group groupname            #按组来查找
-mtime -n +n               #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime   -n +n              #按文件访问时间来查找文件,-n指n天以内,+n指n天以前
-ctime   -n +n              #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup                    #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser                     #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1 !f2              找文件,-n指n天以内,+n指n天以前
-ctime   -n +n              #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup                    #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser                     #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1 !f2              #查更改时间比f1新但比f2旧的文件
-type    b/d/c/p/l/f        #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size     n[c]              #查长度为n块[或n字节]的文件
-depth                      #使查找在进入子目录前先行查找完本目录
-fstype                     #查更改时间比f1新但比f2旧的文件
-type    b/d/c/p/l/f        #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size     n[c]              #查长度为n块[或n字节]的文件
-depth                      #使查找在进入子目录前先行查找完本目录
-fstype                     #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount              &

下面的内容通过概述 find 命令的用途和潜能,简化该命令的学习和使用。同时,它将针对 find 命令的某些最强大但最混乱的方面提供一个基本的指南和参考。

[注意:本文使用的 find 版本是 GNU 版本,因此,某些细节可能与其他版本的 find 有所不同。]

基本格式
开始之前,我们先来看一下 find 命令的基本结构:

find   start_directory  test  options   criteria_to_match
action_to_perform_on_results
                         
在以下命令中,find 将开始在当前目录(用“.”表示)中查找任何扩展名为“java”的文件:
find . -name  "*.java" 
下面是该命令所找到的命令的缩略清单:

find . -name  "*.java"
./REGEXPvalidate/src/oracle/otnsamples/plsql/ConnectionManager.java
./REGEXPvalidate/src/oracle/otnsamples/plsql/DBManager.java
..
[注意:如果您从本文剪切并粘贴来运行该 find 命令,您可能需要使用自己的键盘替换双引号 (“”) 才能得出正确的结果。]

以下命令将执行相同的操作。在这两种情况下,您都需要对通配符进行转义以确保它传递到 find 命令并且不由 shell 解释。因此,请将您的搜索字符串放到引号里,或者在它前面加上反斜线:

find . -name  \*.java
尽管 find 的所有参数均为可选,但是如果您未指定从哪里开始搜索,搜索默认将在当前目录中开始。如果您不指定要匹配的测试连接、选项或值,您的结果将不完整或者无区别。

运行以下三个 find 命令将得出同样的结果 — 当前目录和所有子目录中的所有文件(包括隐藏文件)的完整清单:

find
find .
find . -print
这类似于运行一个带 -la 选项的 ls 命令。如果您希望上述命令的输出包含完整的路径名(或许是为了备份),您将需要指定起始目录的完整路径:

find /home/bluher -name \*.java
/home/bluher/plsql/REGEXPvalidate/src/oracle/otnsamples/plsql/ConnectionManager.java
/home/bluher/plsql/REGEXPvalidate/src/oracle/otnsamples/plsql/DBManager.java/
...
您还可以在搜索字符串中指定多个起始目录。如果以具有相应权限的用户身份运行,以下命令将下到 /usr、/home /tmp 目录查找所有 jar 文件:

find /usr /home  /tmp -name "*.jar"
但是,如果您没有相应的权限,您在开始浏览许多系统目录时将生成错误消息。以下是一个示例:

find:  /tmp/orbit-root: Permission denied
您可以通过附加您的搜索字符串来避免混乱的输出,如下所示:

find /usr /home  /tmp -name "*.jar" 2>/dev/null
这会将所有错误消息发送到空文件,因此提供清理器输出。

默认情况下,find 是区分大小写的。对于不区分大小写的 find,将 -iname 测试替换为 -name 测试。

find downloads  -iname "*.gif"
downloads/.xvpics/Calendar05_enlarged.gif
downloads/lcmgcfexsmall.GIF
除文件名外,您还可以按类型搜索文件。例如,您可以使用以下命令查找一个目录中的所有子目录:
find . -type d        
您可以使用以下命令查找您的/usr 目录中的所有符号链接:

find /usr -type l
这可能会列出 3,000 多个链接。以下的任何一个命令使用根权限运行都将列出 /usr 目录中的链接以及它所指向的文件:

# find /usr/bin  -type l  -name "z*" -exec ls  -l {} \;
lrwxrwxrwx 1 root  root 8 Dec 12 23:17 /usr/bin/zsh -> /bin/zsh
lrwxrwxrwx 1 root  root 5 Dec 12 23:17 /usr/bin/zless -> zmore
lrwxrwxrwx 1 root  root 9 Dec 12 23:17 /usr/bin/zcat -> /bin/zcat
find /usr/bin -type  l  -name "z*" -ls
但是,第二个更短的命令将列出更多的文件,以及目录和 inode 信息:在本文后面的部分中,我们将讨论 -exec 和 -ls 操作的用法。

其他 find 可以找到的文件类型包括:

? b — 块(缓存)特殊
? c — 字符(未缓存)特殊
? p — 命名管道 (FIFO)
? s — 套接字

使用根作为 find 命令的起点会极大地降低系统的速度。如果您必须运行这样一个命令,您可以在非高峰时段或晚上运行它。您可以使用以下语法将输出重定向到一个文件:

find  /   -print > masterfilelist.out
如果您错误地输入一个 find 命令,生成大量不必要的输出,只需按 CTRL-C 中断该命令,这将停止最近执行的命令。

在具多个文件系统的企业网络上,限制 find 查找的文件也是一个特别好用的方法。尽可能多地使用选项和测试以减少系统上的负载。用于此目的的两个最有用的选项是 -xdev 和 -mount。它们通过阻止 find 下到其他文件系统(如 MS-DOS、CD-ROM 或 AFS)上的目录中缩短了搜索范围。这将搜索限制为同一类型的文件系统作为起始目录。

如果运行 mount 命令,双引导系统上的用户可以使用这些选项。假设涉及 Windows 分区,您可以使用类似以下的命令安装它:

mount -t vfat  /dev/sda1 /mnt/msdos
您使用的实际命令取决于您的系统设置。您可以通过运行 df 或执行以下命令验证该分区已安装:

find /mnt/msdos  -name "*.txt" 2> /dev/null
您应该看到 MS Windows 分区上列出了很多的文件。现在,运行以下带 -mount 或 -xdev 选项的命令:

find / -name  "*.txt" -mount 2> /dev/null
或者

find / -name  "*.txt" -xdev 2> /dev/null
还可以使用 -fstype 测试明确告知 find 在哪个文件系统中查找,如以下示例中所示:

find / -name  "*.txt" -fstype vfat 2> /dev/null
查找时间
find 命令有几个用于根据您系统的时间戳搜索文件的选项。这些时间戳包括

? mtime — 文件内容上次修改时间
? atime — 文件被读取或访问的时间
? ctime — 文件状态变化时间

mtime 和 atime 的含义都是很容易理解的,而 ctime 则需要更多的解释。由于 inode 维护着每个文件上的元数据,因此,如果与文件有关的元数据发生变化,则 inode 数据也将变化。这可能是由一系列操作引起的,包括创建到文件的符号链接、更改文件权限或移动了文件等。由于在这些情况下,文件内容不会被读取或修改,因此 mtime 和 atime 不会改变,但 ctime 将发生变化。

这些时间选项都需要与一个值 n 结合使用,指定为 -n、n 或 +n。

? -n 返回项小于 n
? +n 返回项大于 n
? n 返回项正好与 n 相等

下面,我们来看几个例子,以便于理解。以下命令将查找在最近 1 小时内修改的所有文件:

find . -mtime -1
./plsql/FORALLSample
./plsql/RegExpDNASample
/plsql/RegExpSample
用 1 取代 -1 运行同一命令将查找恰好在 1 小时以前修改的所有文件:

find . -mtime 1
上述命令不会生成任何结果,因为它要求完全吻合。以下命令查找 1 个多小时以前修改的所有文件:

find . -mtime +1
默认情况下,-mtime、-atime 和 -ctime 指的是最近 24 小时。但是,如果它们前面加上了开始时间选项,则 24 小时的周期将从当日的开始时间算起。您还可以使用 mmin、amin 和 cmin 查找在不到 1 小时的时间内变化了的时间戳。
如果您在登录到您的帐户后立即运行以下命令,您将找到在不到 1 分钟以前读取的所有文件:

find . -amin -1
./.bashrc
/.bash_history
./.xauthj5FCx1
应该注意的是,使用 find 命令查找文件本身将更改该文件的访问时间作为其元数据的一部分。

您还可以使用 -newer、-anewer 和 –cnewer 选项查找已修改或访问过的文件与特定的文件比较。这类似于 -mtime、-atime 和 –ctime。

? -newer 指内容最近被修改的文件
? -anewer 指最近被读取过的文件
? -cnewer 指状态最近发生变化的文件

要查找您的主目录中自上一个 tar 文件以来以某种方式编辑过的所有文件,使用以下命令:

find . -newer  backup.tar.gz
按大小查找文件
-size 选项查找满足指定的大小条件的文件。要查找所有大于 5MB 的用户文件,使用

find / -size  +5000000c 2> /dev/null
/var/log/lastlog
/var/log/cups/access_log.4
/var/spool/mail/bluher
结尾的“c”以字节为单位报告我们的结果。默认情况下,find 以 512 字节块的数量报告大小。如果我们将“c”替换为“k”,我们还会看到以千字节的数量报告的结果,如果使用“w”,则会看到以两字节字的数量报告的结果。

-size 选项经常用于搜索所有零字节文件并将它们移至 /tmp/zerobyte 文件夹。以下命令恰好可以完成这一任务:

find test -type f  -size 0 -exec mv {} /tmp/zerobyte \;
-exec 操作允许 find 在它遇到的文件上执行任何 shell 命令。在本文的后面部分,您将看到其用法的更多示例。大括号允许移动每个空文件。

选项 -empty 还可用于查找空文件:

find test -empty        
test/foo
test/test
按权限和所有者查找
要监视您的系统安全离不开 find 命令。您可以使用符号或八进制表示法查找面向广大用户开放的文件,如下所示:

find . -type f  -perm a=rwx -exec ls -l {} \;
或者

find . -type f  -perm 777 -exec ls -l {} \;
-rwxrwxrwx 1 bluher  users 0 May 24 14:14 ./test.txt
在这一部分中,在上面和下面的命令中,我们使用了 -exec ls -l 操作,因此,您可以看到返回的文件的实际权限。以下命令将查找可由“other”和组写入的文件:

find plsql -type f  -perm -ug=rw -exec ls -l {} \; 2>/dev/null
或者

find plsql -type f  -perm -220 -exec ls -l {} \; 2>/dev/null
-rw-rw-rw- 1 bluher users 4303  Jun  7   2004 plsql/FORALLSample/doc/otn_new.css
-rw-rw-rw- 1 bluher users 10286 Jan  12  2005  plsql/FORALLSample/doc/readme.html
-rw-rw-rw- 1 bluher users 22647 Jan  12  2005  plsql/FORALLSample/src/config.sql
..
下一个命令将查找由用户、组或二者共同写入的文件:
find plsql -type f  -perm /ug=rw -exec ls -l {} \; 2>/dev/null, or,
find plsql -type f  -perm /220 -exec ls -l {} \; 2>/dev/null
-rw-r--r-- 1 bluher users 21473  May  3 16:02 plsql/regexpvalidate.zip
-rw-rw-rw- 1 bluher users 4303  Jun  7   2004 plsql/FORALLSample/doc/otn_new.css
-rw-rw-rw- 1 bluher users 10286 Jan  12  2005  plsql/FORALLSample/doc/readme.html
-rw-rw-rw- 1 bluher users 22647 Jan  12  2005  plsql/FORALLSample/src/config.sql
您可能会看到以下命令在 Web 和较早的手册中引用过:

find . -perm +220  -exec ls -l {} \; 2> /dev/null
+ 符号的作用与 / 符号相同,但是现在新版 GNU findutils 中不支持使用该符号。

要查找您的系统上所有人都可以写入的所有文件,使用以下命令:

find / -wholename  '/proc' -prune  -o  -type f -perm -0002 -exec ls -l {} \;
-rw-rw-rw- 1 bluher users 4303  Jun  7   2004/home/bluher/plsql/FORALLSample/doc/otn_new.css
-rw-rw-rw- 1 bluher users 10286 Jan  12  2005  /home/bluher/plsql/FORALLSample/doc/readme.html
...
第 4 个权限将在稍后进行讨论,但最后一个字段中的“2”是文件权限中的“other”字段,也称为写入位。我们在权限模式 0002 前面使用了破折号,以指明我们希望看到为 other 设置了写权限的文件,无论其他权限设置为什么。

上述命令还引入了三个新概念。针对文件模式“/proc”使用 -wholename 测试,如果该模式已找到,-prune 可防止 find 下到该目录中。布尔类型“-o”使 find 可以针对其他目录处理该命令的其余部分。由于每个表达式之间有一个假设的隐式 and 运算符 (-a),因此,如果左侧的表达式计算结果为 false,and 之后的表达式将不进行计算;因此需要 -o 运算符。Find 还支持布尔类型 -not、!,就像使用括号强行优先一样。

系统管理员经常使用 find 通过用户或组的名称或 ID 搜索特定用户或组的常规文件:

[root] $  find / -type f -user bluher -exec ls -ls {}  \;
下面是这样一个命令的高度精简的输出示例:

4 -rw-r--r-- 1 bluher users 48  May  1 03:09  /home/bluher/public_html/.directory
4 -rw-r--r-- 1 bluher users 925  May  1 03:09 /home/bluher/.profile
您还可以使用 find 按组查找文件:

[root] $ find /  -type f -group users
find / -type d -gid  100
该命令将列出由 ID 为 100 的组拥有的目录。要找到相应的 uid 或 gid,您可以针对 /etc/passwd 或 /etc/group 文件运行 more 或 cat 命令。

除了查找特定已知用户和组的文件外,您还会发现它对于查找没有这些信息的文件也很有用。下一个命令将识别未列在 /etc/passwd 或 /etc/group 文件中的文件:

find / -nouser -o  -nogroup
上述命令可能不会在您的系统上生成实际的结果。但是,它可用于识别或许在经常移动后没有用户或组的文件。

好了,现在我们可以解决本部分开始时提到的格外重要的权限了。

SGID 和 SUID 是特殊访问权限标志,可以分配给基于 UNIX 的操作系统上的文件和目录。设置它们是为了允许访问计算机系统的普通用户使用临时提升的权限执行二进制可执行文件。

find /  \( -perm -2000 -o -perm -4000 \) -ls
167901    12 -rwsr-xr-x    1 root      root          9340 Jun 16  2006 /usr/bin/rsh
167334    12 -rwxr-sr-x    1 root      tty          10532 May  4  2007 /usr/bin/wall
在上述命令中,您可以看到转义括号的使用。您还可以看到权限的不同。第一个文件设置了 SGID 权限,第二个文件设置了 SUID 权限。上述命令中的最后的操作与带 -exec ls -dils 操作的 find 效果类似。

控制 find
与 Linux 中的许多命令不同,find 不需要 -r 或 -R 选项即可下到子目录中。它默认情况下就这样操作。但是,有时您可能希望限制这一行为。因此,选项 -depth、-maxdepth 和 -mindepth 以及操作 -prune 就派上用场了。

我们已经看到了 -prune 是多么有用,下面让我们来看看 -depth、-maxdepth 和 -mindepth 选项。

-maxdepth 和 -mindepth 选项允许您指定您希望 find 搜索深入到目录树的哪一级别。如果您希望 find 只在目录的一个级别中查找,您可以使用 maxdepth 选项。

通过运行以下命令在目录树的前三个级别中查找日志文件,您可以看到 -maxdepth 的效果。使用该选项较之不使用该选项所生成的输出要少得多。

find / -maxdepth 3  -name "*log"
您还可以让 find 在至少下至目录树三个级别的目录中查找:

find / -mindepth 3  -name "*log"
-depth 选项确保先在一个目录中进行查找,然后才在其子目录中进行查找。以下命令提供了一个示例:

find -name "*test*" -depth
./test/test
./test
./localbin/test
./localbin/test_shell_var
./localbin/test.txt
./test2/test/test
./test2/test
./test2
find 世界
我们已经看过了 find 命令的一些更加有用以及有点难懂的功能,但是 find 还可以执行更多的任务。例如,有多个选项可以使 find 与较低的 UNIX 版本和其他操作系统相兼容并允许您执行打印输出到多个文件等操作。阅读本文后,您现在已经有了理解 find 参考指南的背景,我鼓励您深入研究这一强大、有用的工具。
分享到:
评论

相关推荐

    Linux学习笔记【博文整理系列】

    Linux笔记——命令:find Linux笔记——命令:Sort,uniq,join,cut,paste,split Linux笔记——shell基础:变量&本地变量&位置变量&特定变量参数 Linux笔记——条件测试test Linux笔记——控制流 Linux笔记——shell...

    Linux命令笔记

    1:find 文件搜索 语法:find [搜索范围][比配条件] 2:locate 在文件资料库中查找文件 语法:locate 文件名 3:which 搜索命令所在目录级别名信息 语法:which[命令名称] 4:whereis 搜索命令所在目录级帮助文档路径 ...

    linux-find-命令的详细说明.zip

    linux-find-命令的详细说明

    Linux最佳入门-个人学习笔记-知识点总结.rar

    这是个人10年前的Linux Ubuntu学习笔记,之后查笔记时,都会补充新知识,也有纠错,涵盖了10个PDF文件,由有道笔记导出,非常适合初学者。这些PDF文件包含了丰富的知识和实用技巧,能够帮助您更好...1.10 find命令.pdf

    批处理学习笔记

    自学批处理笔记(15)find findstr 批处理练习(3) 文件处理 制作进度条 判断字符长度 自学批处理笔记(16)常用符号详解 explorer 自学批处理笔记(17)schtasks /create 自学批处理笔记(18)schtasks /change /...

    计算机辅助设计课堂笔记.docx

    点set surfs,再点面中间的形式符号,最后点mesh即可quick edit中的adjust/set density改变网格数split surf-lines点线切割命令add point online在线上加点node edit中的align node 计算机辅助设计课堂笔记全文共6页...

    Centos 7下的操作命令

    在学习CentOS 7中整理的课堂笔记,主要是对shell下的命令进行的操作。

    Laravel学习笔记之Artisan命令生成自定义模板的方法

    备注:个人平时在写Repository代码时会这样写,如先写上ShopRepositoryInterface并定义好接口方法如all()、create()、update()、delete()、findBy()等等,然后再写上接口对应的实现ShopRepository并

    渗透初学笔记(一) 基础工具

    渗透初学笔记 渗透测试的开始需要对其渗透的流程有着大概的理解,但是更为重要的是对于一些基础的工具的熟练掌握,以下简要介绍了bash、nc、wireshark的基础部分,但是看的再多都不如自己动手操作一下。实践和总结才...

    net学习笔记及其他代码应用

    DataCommand:执行语句命令。 DataAdapter:数据的集合,用语填充。 19.ASP.net的身份验证方式有哪些?分别是什么原理? 答:10。Windwos(默认)用IIS...From(窗体)用帐户....Passport(密钥) 20.什么是Code-Behind...

    MongoDB最基本命令速查笔记

    db.colleciton.find()来查找表格的所有数据。 db.serverStatus()查看数据库服务器的状态。 db.stats()查询指定数据库的统计信息。 use xxx如果数据库不存在则创建数据库(必须在虽然插入一条数据) db....

    Mongodb使用笔记

    一、安装 1.下载地址: ...2.解压缩到自己想要安装的目录,比如d:\mongodb 3.创建文件夹d:\mongodb\db、d:\mongodb\log,分别用来安装db和日志文件,在log文件夹下创建一个日志文件MongoDB.log,即d:\... db.task.find()

    2009 达内Unix学习笔记

    集合了 所有的 Unix命令大全 登陆服务器时输入 公帐号 openlab-open123 telnet 192.168.0.23 自己帐号 sd08077-you0 ftp工具 192.168.0.202 tools-toolss 老师测评网址 http://172.16.0.198:8080/poll/ 各个 ...

    MongoDB学习笔记

    切换库 ...db.blog.find(); db.blog.findOne(); 更新 1.post.cruser="lzgadmin"; 2.db.blog.update({"title":"lzgtitle"},post); 删除 db.blog.remove({"title":"lzgtitl2"}); ....................

    阿里云ossjava源码-react-native-doc:关于React-native个人踩坑笔记

    React-native个人踩坑笔记 1. Q: react-native-vector-icons 所有配置完毕后不生效 ​ A:复制fonts字体文件到 android/app/src/main/assets/fonts/目录下 2.Q:运行 react-native run-android 命令报错: Could not...

    vscode-markdown-draw:用鼠标或钢笔快速绘制svg,专为做笔记,公式起草而设计。 支持HTROCR到乳胶

    画笔记 这个项目处于原型阶段! 用鼠标或钢笔快速绘制svg, 专为记笔记,公式起草而设计 现在支持OCR到乳胶(通过 ) 用法 打开markdown文件,右键单击... // find a icon from https://fontawesome.com/v5.8.2/icon

    minigrep:用Rust编写的grep命令的小版本

    Minigrep要求应该安装在您的系统中。...文献资料cargo doc --no-deps --open运行测试cargo test笔记这并不是替换旧的类似grep的旧命令的好地方。 这是为了学习Rust-lang而编写的。开源背后的动机实际上

    YoCli:用于记录使用.Net Core构建的笔记的命令行工具

    主要命令是yo ,它有六个子命令: 2.2.0 Usage: yo [command] [options] Options: --version Show version information -?|-h|--help Show help information Commands: export Export notes to Json file find ...

    java红酒网站源码-Pentest-notes:Pentest-笔记

    java网站源码Pentest-笔记 目录 卡利Linux 将目标 IP 地址设置为$ip系统变量export ip=192.168.1.100 找到一个文件的位置locate sbd.exe 在$PATH环境变量which sbd 查找名称中包含特定字符串的文件的搜索: find / -...

    java红酒网站源码-OSCP-Notes:OSCP-笔记

    java网站源码OSCP-笔记 卡利Linux 将目标 IP 地址设置为$ip系统变量export ip=192.168.1.100 查找文件的位置locate sbd.exe 在$PATH环境变量中搜索目录which sbd 查找名称中包含特定字符串的文件的搜索: find / -...

Global site tag (gtag.js) - Google Analytics