> 问答

Linux Find命令精通指南

人阅读 2024-10-16 08:06:22Linux
广告 X
欧意最新版本

欧意最新版本

欧意最新版本app是一款安全、稳定、可靠的数字货币交易平台。

APP下载  官网地址

  Linux find 命令是所有 Linux 命令中最有用的一个,同时也是最混乱的一个。它很难,因为它的语法与其他 Linux 命令的标准语法不同。但是,它很强大,因为它允许您按文件名、文件类型、用户甚至是时间戳查找文件。使用 find 命令,您不但可以找到具这些属性任意组合的文件,还可以对它找到的文件执行操作。

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

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

  基本格式

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

  find   start_directory  test  options   criteria_to_matchaction_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.gifdownloads/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/zshlrwxrwxrwx 1 root  root 5 Dec 12 23:17 /usr/bin/zless -> zmorelrwxrwxrwx 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 — 套接字

#p#副标题#e#

  使用根作为 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",我们还会看到以千

关键词标签:Linux,Find命令

LOT物联网

iot产品 iot技术 iot应用 iot工程

Powered By LOT物联网  闽ICP备2024036174号-1

联系邮箱:support1012@126.com