https://os.51cto.com/art/202003/612049.htm

find 命令有巨多的选项可以帮助你准确定位你在 Linux 系统上需要寻找的文件。这篇文章讨论了一系列非常有用的选项。

在 Linux 系统上有许多用于查找文件的命令,而你在使用它们时也有巨多的选项可以使用。

例如,你不仅可以通过文件的名称来查找文件,还可以通过文件的所有者或者组、它们的创建时间、大小、分配的权限、最后一次访问它们的时间、关联的信息节点,甚至是文件是否属于系统上不再存在的帐户或组等等来查找文件。

你还可以指定搜索从哪里开始,搜索应该深入到文件系统的什么位置,以及搜索结果将告诉你它所找到的文件的数量。

而所有这些要求都可以通过 find 命令来处理。

下面提供了根据这些要求查找文件的示例。在某些命令中,错误(例如试图列出你没有读取权限的文件)输出将被发送到 /dev/null,以便我们不必查看它。或者,我们可以简单地以 root 身份运行以避免这个问题。

请记住,还有更多的其他选项。这篇文章涵盖了很多内容,但并不是 find 命令帮助你定位查找文件的所有方式。

选择起点

使用 find,你可以选择一个起点或从你所在的位置开始。要选择的搜索的起点,请在单词 find 后输入它。例如,find /usr 或 find ./bin 将在 /usr 目录或当前位置下的 bin 目录开始搜索,而 find ~ 将在你的主目录中开始搜索,即使你当前位于当前文件系统中的其他位置。

选择你要找的

最常用的搜索策略之一是按名称搜索文件。这需要使用 -name 选项。

默认情况下,find 会显示找到的文件的完整路径。如果你在命令中添加 -print,你会看到同样的结果。如果你想查看与文件相关的详细信息—-例如:文件的长度、权限等,你需要在你的 find 命令的末尾添加 -ls 参数。

  1. $ find ~/bin -name tryme
  2. /home/shs/bin/tryme
  3. $ find ~/bin -name tryme -print
  4. /home/shs/bin/tryme
  5. $ find ~/bin -name tryme -ls
  6. 917528 4 -rwx------ 1 shs shs 139 Apr 8 2019 /home/shs/bin/tryme

你也可以使用子字符串来查找文件。例如,如果你将上面示例中的 tryme 替换为 try*,你将会找到所有名称以 try 开头的文件。(LCTT 译注:如果要使用通配符 * ,请将搜索字符串放到单引号或双引号内,以避免通配符被 shell 所解释)

按名称查找文件可能是 find 命令最典型的用法,不过还有很多其他的方式来查找文件,并且有这样做的需要。下面的部分展示了如何使用其他可用的方式。

此外,当按文件大小、组、索引节点等条件来搜索文件时,你需要确认找到的文件与你要查找的文件是否相匹配。使用 -ls 选项来显示细节是非常有用。

通过大小查找文件

按大小查找文件需要使用 -size 选项并且对相应规范使用一点技巧。例如,如果你指定 -size 189b,你将找到 189 个块大小的文件,而不是 189 个字节。(LCTT 译注:如果不跟上单位,默认单位是 b。一个块是 512 个字节大小,不足或正好 512 个字节将占据一个块。)对于字节,你需要使用 --size 189c(字符)。而且,如果你指定 --size 200w ,你将会找到 200 个“字word”的文件——以“双字节增量”为单位的字,而不是“我们互相谈论的那些事情”中的单词。你还可以通过以千字节(k)、兆字节(M)和千兆字节(G)为单位提供大小来查找文件。(LCTT 译注:乃至还有 TP

大多数情况下,Linux 用户会搜索比选定大小要大的文件。例如,要查找大于 1 千兆字节的文件,你可以使用这样的命令,其中 +1G 表示“大于 1 千兆字节”:

  1. $ find -size +1G -ls 2>/dev/null
  2. 787715 1053976 -rw-rw-r-- 1 shs shs 1079263432 Dec 21 2018 ./backup.zip
  3. 801834 1052556 -rw-rw-r-- 1 shs shs 1077809525 Dec 21 2018 ./2019/hold.zip

通过索引节点号查找文件

你可以通过用于维护文件元数据(即除文件内容和文件名之外的所有内容)的索引节点来查找文件。

  1. $ find -inum 919674 -ls 2>/dev/null
  2. 919674 4 -rw-rw-r-- 1 shs shs 512 Dec 27 15:25 ./bin/my.log

查找具有特定文件所有者或组的文件

按所有者或组查找文件也非常简单。这里我们使用 sudo 来解决权限问题。

  1. $ sudo find /home -user nemo -name "*.png" -ls
  2. 1705219 4 drwxr-xr-x 2 nemo nemo 4096 Jan 28 08:50 /home/nemo/Pictures/me.png

在下面这个命令中,我们寻找一个被称为 admins 的多用户组拥有的文件。

  1. # find /tmp -group admins -ls
  2. 262199 4 -rwxr-x--- 1 dory admins 27 Feb 16 18:57 /tmp/testscript

查找没有所有者或组的文件

你可以使用如下命令所示的 -nouser 选项来查找不属于当前系统上的任何用户的文件。

  1. # find /tmp -nouser -ls
  2. 262204 4 -rwx------ 1 1016 1016 17 Feb 17 16:42 /tmp/hello

请注意,该列表显示了旧用户的 UID 和 GID,这清楚地表明该用户未在系统上定义。这种命令将查找帐户已从系统中删除的用户创建在主目录之外的文件,或者在用户帐户被删除后而未被删除的主目录中创建的文件。类似地,-nogroup 选项也会找到这样的文件,尤其是当这些用户是相关组的唯一成员时。

按上次更新时间查找文件

在此命令中,我们在特定用户的主目录中查找过去 24 小时内更新过的文件。sudo 用于搜索另一个用户的主目录。

  1. $ sudo find /home/nemo -mtime -1
  2. /home/nemo
  3. /home/nemo/snap/cheat
  4. /home/nemo/tryme

按上次更改权限的时间查找文件

-ctime 选项可以帮助你查找在某个参考时间范围内状态(如权限)发生更改的文件。以下是查找在最后一天内权限发生更改的文件的示例:

  1. $ find . -ctime -1 -ls
  2. 787987 4 -rwxr-xr-x 1 shs shs 189 Feb 11 07:31 ./tryme

请记住,显示的日期和时间只反映了对文件内容进行的最后更新。你需要使用像 stat 这样的命令来查看与文件相关联的三个状态(文件创建、修改和状态更改)。

按上次访问的时间查找文件

在这个命令中,我们使用 -atime 选项查找在过去两天内访问过的本地 pdf 文件。

  1. $ find -name "*.pdf" -atime -2
  2. ./Wingding_Invites.pdf

根据文件相对于另一个文件的时间来查找文件

你可以使用 -newer 选项来查找比其他文件更新的文件。

  1. $ find . -newer dig1 -ls
  2. 786434 68 drwxr-xr-x 67 shs shs 69632 Feb 16 19:05 .
  3. 1064442 4 drwxr-xr-x 5 shs shs 4096 Feb 16 11:06 ./snap/cheat
  4. 791846 4 -rw-rw-r-- 1 shs shs 649 Feb 13 14:26 ./dig

没有相应的 -older 选项,但是你可以用 ! -newer (即更旧)得到类似的结果,它们基本上一样。

按类型查找文件

通过文件类型找到一个文件,你有很多选项——常规文件、目录、块和字符文件等等。以下是文件类型选项列表:

  1. b 块特殊文件(缓冲的)
  2. c 字符特殊文件(无缓冲的)
  3. d 目录
  4. p 命名管道(FIFO)
  5. f 常规文件
  6. l 符号链接
  7. s 套接字

这里有一个寻找符号链接的例子:

  1. $ find . -type l -ls
  2. 805717 0 lrwxrwxrwx 1 shs shs 11 Apr 10 2019 ./volcano -> volcano.pdf
  3. 918552 0 lrwxrwxrwx 1 shs shs 1 Jun 16 2018 ./letter -> pers/letter2mom

限制查找的深度

-mindepth 和 -maxdepth 选项控制在文件系统中搜索的深度(从当前位置或起始点开始)。

  1. $ find -maxdepth 3 -name "*loop"
  2. ./bin/save/oldloop
  3. ./bin/long-loop
  4. ./private/loop

查找空文件

在这个命令中,我们寻找空文件,但不进入目录及其子目录。

  1. $ find . -maxdepth 2 -empty -type f -ls
  2. 917517 0 -rw-rw-r-- 1 shs shs 0 Sep 23 11:00 ./complaints/newfile
  3. 792050 0 -rw-rw-r-- 1 shs shs 0 Oct 4 19:02 ./junk

按权限查找文件

你可以使用 -perm 选项查找具有特定权限集的文件。在下面的示例中,我们只查找常规文件(-type f),以避免看到符号链接,默认情况下符号链接被赋予了这种权限,即使它们所引用的文件是受限的。

  1. $ find -perm 777 -type f -ls
  2. find: ‘./.dbus’: Permission denied
  3. 798748 4 -rwxrwxrwx 1 shs shs 15 Mar 28 2019 ./runme

使用查找来帮助你删除文件

如果使用如下命令,你可以使用 find 命令定位并删除文件:

  1. $ find . -name runme -exec rm {} \;

{} 代表根据搜索条件找到的每个文件的名称。

一个非常有用的选项是将 -exec 替换为 -ok。当你这样做时,find 会在删除任何文件之前要求确认。

  1. $ find . -name runme -ok rm -rf {} \;
  2. < rm ... ./bin/runme > ?

删除文件并不是 -ok 和 -exec 能为你做的唯一事情。例如,你可以复制、重命名或移动文件。

确实有很多选择可以有效地使用 find 命令,毫无疑问还有一些在本文中没有涉及到。我希望你已经找到一些新的,特别有帮助的。

ZT:通过Find命令找到你要找的东西的更多相关文章

  1. node使用express命令报错找不到ejs的解决方法

    首先确定已经全局安装过好几遍express和express-generator,但一使用express命令直接报找不到ejs模块,全局和本地安装ejs都没用,nodemon模块报同样错误,找不到deb ...

  2. javac 不是内部或外部命令 和 错误 找不到或无法加载主类 的解决方法

    使用package语句与import语句. 实验要求:按实验要求使用package语句,并用import语句使用Java平台提供的包中的类以及自定义包中的类.掌握一些重要的操作步骤. 代码: 模板1: ...

  3. 零基础学Java(9)在mac上运行命令行提示"找不到或无法加载主类"

    天坑 遇到的问题:使用命令行执行命令:java EightSample,会报以下错误 错误: 找不到或无法加载主类 EightSample 运行环境 mac系统 IntelliJ IDEA编译器 Ja ...

  4. command not found所有执行命令总是报找不到

    输入 ll命令 提示: bash: ls: 未找到命令…  相似命令是: 'lz' 原因: 环境变量PATH被修改了 解决办法: 执行: export PATH=/bin:/usr/bin:$PATH ...

  5. 远程ssh执行命令时提示找不到命令

    最开始的时候碰到这种问题,是在hadoop003上配置了jdk1.8, 在hadoop002上执行ssh hadoop003 java -version提示没有命令,先ssh hadoop003然后执 ...

  6. liunx -bash:ls:command not found,执行命令总是报找不到

    解决办法: 使用绝对命令vi打开profile /bin/vi  /etc/profile 添加: export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/ ...

  7. Ubuntu里node命令出错,找不到

    ubuntu里用sudo apt-get install nodejs安装Node.js后, 发现terminals里运行node命令(比如node –-version)时候会有No such fil ...

  8. Unity 常用常找的东西存放

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50483316 作者:car ...

  9. 如何快速在Github找到你想要的东西

    众所周知 Github是全球最大的xx交友平台,虽然被收购了.但是不并没有什么影响. 使用Git可以做很多事,在这里不再缀述,上面的资源也是多种多样,应有尽有 对于这样一个平台,我们想快速找到自己需要 ...

随机推荐

  1. JavaScript calss语法糖

    JavaScript calss语法糖 基础知识 严格意义上来讲,在Js中是没有类这一概念的. 我们可以运用前面章节提到的构造函数来模拟出类这一概念,并且可以通过原型对象的继承来完美的实现实例对象方法 ...

  2. C#LeetCode刷题之#707-设计链表(Design Linked List)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4118 访问. 设计链表的实现.您可以选择使用单链表或双链表.单链 ...

  3. Kubernetes用Helm安装Ingress并踩一下使用的坑

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Ingress是Kubernetes一个非常重要的Controller,它类似一个路由转发的组件,可以让外界访问Kubern ...

  4. Xor 思维题

    Xor 思维题 题目描述 小\(Q\)与小\(T\)正在玩一棵树.这棵树有\(n\)个节点,编号为 \(1\),\(2\) \(3...n\),由\(n-1\)条边连接,每个节点有一个权值\(w_i\ ...

  5. node.js 出现server instance pool was destroyed

    初步判断为MongodbClient断开连接的原因. 之所以断开连接,可能是多个操作间隔时间比较久. 解决方法之一,不要调用close方法.

  6. 从零搭建Spring Boot脚手架(6):整合Redis作为缓存

    1. 前言 上一文我们整合了Mybatis Plus,今天我们会把缓存也集成进来.缓存是一个系统应用必备的一种功能,除了在减轻数据库的压力之外.还在存储一些短时效的数据场景中发挥着重大作用,比如存储用 ...

  7. idea提升效率的插件

    这篇文章用于记录idea插件.多分类记录确实可以提升效率. 1. FindBugs 虽说Idea本身提供的代码检查工具已经很强大了,但Idea提供的更多是规范性的检查,如果需要深入地检查异常,可以使用 ...

  8. 实现直方图均衡化(java+opencv)

    什么是直方图均衡化? 直方图均衡化是一种简单有效的图像增强技术,通过改变图像的直方图来改变图像中各像素的灰度,主要用于增强动态范围偏小的图像的对比度.原始图像由于其灰度分布可能集中在较窄的区间,造成图 ...

  9. Linux之lldptool工具

    1. 描述当我们想在操作系统里面查看网口和交换机连接的状态信息,我们可以使用lldptool这个工具2.LLDP协议LLDP是Link Layer Discovery Protocol 链路层发现协议 ...

  10. 可爱的python

    可爱的python 作者:  哲思社区出版社: 电子工业出版社 优点 1. 案列讲解很详细,前几章的内容恰好是我想要了解的,例如利用python os模块读取磁盘的文件,或者获得文字的编码方式.这些内 ...