linux常用命令find命令,Linux find命令
谢丽尔卡里什
简要介绍这个无处不在的命令的强大和令人困惑的方面。
2008年7月出版
Linux find命令是所有Linux命令中最有用也最令人困惑的。这很难,因为它的语法不同于其他Linux命令的标准语法。但是,它很强大,因为它允许您通过文件名、文件类型、用户甚至时间戳来查找文件。使用find命令,不仅可以查找具有这些属性的任意组合的文件,还可以对找到的文件执行操作。
本文的目的是通过概述find命令的用途和潜力来简化find命令的学习和使用。同时,它将为find命令的一些最强大但令人困惑的方面提供基本的指导和参考。
【注意:本文使用的find版本是GNU版本,所以一些细节可能与find其他版本有所不同。]
基本格式
在开始之前,让我们看一下find命令的基本结构:
查找开始目录测试选项标准匹配
行动执行结果
在下面的命令中,find将开始在当前目录(用“.”表示)中查找任何扩展名为“java”的文件):
找到。-姓名 *。 java
以下是该命令找到的命令的缩写列表:
找到。-姓名 *。 java 。/REGEXPvalidate/src/Oracle/OTN samples/plsql/connection manager . Java。/REGEXPvalidate/src/Oracle/OTN samples/plsql/dbmanager . Java
.
[注意:如果您从本文中剪切并粘贴来运行这个find命令,您可能需要使用自己的键盘而不是双引号("")来获得正确的结果。]
下面的命令也可以做到这一点。在这两种情况下,您都需要对通配符进行转义,以确保它被传递给find命令,并且不会被shell解释。因此,请将您的搜索字符串放在引号中,或者在它前面放一个反斜杠:
找到。-name /*。爪哇岛
尽管find的所有参数都是可选的,但是如果不指定从哪里开始搜索,默认情况下,搜索将从当前目录开始。如果不指定测试连接、选项或匹配值,您的结果将是不完整的或不可区分的。
运行以下三个find命令将得到相同的结果—当前目录和所有子目录中所有文件(包括隐藏文件)的完整列表:
发现
找到。
找到。-打印
这类似于使用-la选项运行ls命令。如果您希望上述命令的输出包含完整的路径名(可能用于备份),您将需要指定起始目录的完整路径:
查找/home/bluher -name /*。爪哇岛
/home/blu her/plsql/REGEXPvalidate/src/Oracle/OTN samples/plsql/connection manager . Java
/home/blu her/plsql/REGEXPvalidate/src/Oracle/OTN samples/plsql/dbmanager . Java/
.
您也可以在搜索字符串中指定多个起始目录。如果您以具有适当权限的用户身份运行,以下命令将转到/usr和/home /tmp目录,以查找所有jar文件:
查找/usr /home /tmp -name *。罐子
但是,如果您没有适当的权限,当您开始浏览许多系统目录时,将会生成错误消息。下面是一个例子:
find: /tmp/orbit-root:权限被拒绝
通过附加搜索字符串,可以避免混淆输出,如下所示:
查找/usr /home /tmp -name *。jar 2 /dev/null
这将把所有错误信息发送到一个空文件中,从而提供更清晰的输出。
默认情况下,find区分大小写。对于不区分大小写的查找,请用-name测试替换-iname测试。
查找下载-文件名 *。 gif
下载/。xvpics/Calendar05_enlarged.gif
下载/lcmgcfexsmall。GIF格式
除了文件名,您还可以按类型搜索文件。例如,您可以使用以下命令查找目录中的所有子目录:
找到。-d型
您可以使用以下命令在/usr目录中查找所有符号链接:
查找/usr-类型l
这可能会列出3000多个链接。使用root权限运行以下任何命令都会列出/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-z more
lrwxrwxrwx 1根根12年12月9日23:17 /usr/bin/zcat - /bin/zcat
find /usr/bin -type l -name z* -ls
但是,第二个较短的命令将列出更多的文件,以及目录和inode信息:在本文的后面部分,我们将讨论-exec和-ls操作的用法。
find可以找到的其他文件类型包括:
b-特殊块(缓存)
c字符(未缓存)特殊
p-命名管道(FIFO)
s形插座
使用root作为find命令的起始点会大大降低系统的速度。如果必须运行这样的命令,可以在非高峰时段或晚上运行。您可以使用以下语法将输出重定向到文件:
find/-print masterfilelist.out
如果误输入了find命令,生成了大量不必要的输出,只需按CTRL-C中断命令,就会停止最近执行的命令。
在
在具有多个文件系统的企业网络上,限制查找。
这也是一个特别容易找到的文件。使用尽可能多的选项和测试来减少系统负载。为此,两个最有用的选项是-xdev和
-山.通过阻止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—更改文件状态的时间
时间
和atime很容易理解,而ctime需要更多的解释。感谢inode
维护每个文件的元数据,因此如果与文件相关的元数据发生变化,inode
数据也会发生变化。这可能是由一系列操作引起的,包括创建指向文件的符号链接、更改文件权限或移动文件等。由于在这些情况下文件的内容不会被读取或修改,因此
Mtime和atime不会变,但ctime会变。
这些时间选项都需要与指定为-n、n或n的值n结合使用。
-n返回的项目小于n
返回的项目n大于n。
返回的项n正好等于n。
下面,我们来看几个例子,方便理解。以下命令将查找最近1小时内修改的所有文件:
找到。-时间-1。/plsql/FORALLSample。/plsql/RegExpDNASample
/plsql/RegExpSample
使用1而不是-1运行相同的命令将找到1小时前修改的所有文件:
找到。-mtime 1
上面的命令不会产生任何结果,因为它需要完全匹配。以下命令查找1小时前修改的所有文件:
找到。-mtime 1
默认情况下,-mtime,-atime和-ctime指的是过去24小时。但是,如果它们前面有开始时间选项,则24小时周期将从当天的开始时间开始计算。还可以使用mmin、amin和cmin来查找不到1小时内发生变化的时间戳。
如果您在登录到您的帐户后立即运行以下命令,您将找到不到1分钟前读取的所有文件:
找到。-阿明-1。/.没有则创建
/.bash _历史。/.xauthj5FCx1
应该注意的是,使用find命令查找文件本身会改变文件作为其元数据一部分的访问时间。
您还可以使用-newer、-anewer和-cn ewer选项来查找修改或访问的文件,以便与特定文件进行比较。这类似于-mtime、-atime和--ctime。
-较新是指其内容最近被修改过的文件。
-较新的是指最近被读取的文件。
-CNEWER是指其状态最近发生了变化的文件。
要在您的主目录中查找自上一个tar文件以来以某种方式编辑过的所有文件,请使用以下命令:
找到。-新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文件夹中。以下命令可以完成这项任务:
找测试型f-size 0-exec mv { }/tmp/zero byte/;
-exec操作允许find对遇到的文件执行任何shell命令。在本文的后面,您将看到更多关于它的用法的例子。大括号允许你移动每一个空文件。
Option -empty也可用于查找空文件:
查找测试-空
测试/foo
测试/测试
按权限和所有者查找
没有find命令,您无法监控您的系统安全性。您可以使用符号或八进制符号来查找对大量用户开放的文件,如下所示:
找到。-type f-perm a=rwx-exec ls-l { }/;
或者
找到。-型号f-perm 777-exec ls-l { }/;
-rwxrwxrwx 1 bluher用户0 5月24日14:14。/test.txt
在本节中,在上面和下面的命令中,我们使用了-exec ls -l操作,因此您可以看到返回文件的实际权限。以下命令将查找可由“其他”和组写入的文件:
查找plsql-type f-perm-ug=rw-exec ls-l { }/;2 /dev/null
或者
查找plsql-type f-perm-220-exec ls-l { }/;2 /dev/null
2004年6月7日plsql/for all sample/doc/OTN _ new . CSS
2005年1月12日plsql/for all sample/doc/readme . html
2005年1月12日plsql/for all sample/src/config . SQL
.
下一个命令将查找由用户和/或组编写的文件:
find plsql-type f-perm/ug=rw-exec ls-l { }/;2 /dev/null,或者,
查找plsql-type f-perm/220-exec ls-l { }/;2 /dev/null
-rw-r-r-1 blu her users 21473 5月3日16:02 plsql/regexpvalidate.zip
2004年6月7日plsql/for all sample/doc/OTN _ new . CSS
2005年1月12日plsql/for all sample/doc/readme . html
2005年1月12日plsql/for all sample/src/config . SQL
您可能会看到在Web和早期手册中引用了以下命令:
找到。-perm 220-exec ls-l { }/;2 /dev/null
该符号的功能与/符号相同,但是在新版本的GNU findutils中不支持它。
要查找系统中每个人都可以写入的所有文件,请使用以下命令:
find/-whole name /proc -prune-o-type f-perm-0002-exec ls-l { }/;
-rw-rw-rw- 1 bluher用户4303 2004年6月7日/home/blu her/plsql/for all sample/doc/OTN _ new . CSS
-rw-rw-rw- 1 bluher用户10286 2005年1月12日/home/blu her/plsql/for all sample/doc/readme . html
.
第四个权限将在后面讨论,但最后一个字段中的“2”是文件权限中的“其他”字段,也称为写入位。我们在权限模式0002前面使用破折号来表示我们希望看到为其他人设置了写权限的文件,而不考虑其他权限设置。
上面的命令还引入了三个新概念。对文件模式“/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 blu her users 48 May 1 03:09/home/blu her/public _ html/。目录
4 -rw-r - r - 1 bluher用户925 May 1 03:09 /home/bluher/。轮廓
您也可以使用“查找”按组查找文件:
[root]$ find/-类型f-组用户
查找/-d-GID 100型
该命令将列出ID为100的组所拥有的目录。要找到相应的uid或gid,可以对/etc/passwd或/etc/group文件运行more或cat命令。
除了查找特定已知用户和组的文件,您还会发现它对于查找没有这些信息的文件很有用。下一个命令将识别未在/etc/passwd或/etc/group文件中列出的文件:
find/-nouser -o -nogroup
上述命令可能不会在您的系统上产生实际结果。但是,它可用于识别频繁移动后可能没有用户或组的文件。
好了,现在我们可以解决这部分开头提到的额外的重要权限了。
SGID和SUID是特殊的访问权限标志,可以分配给基于UNIX的操作系统上的文件和目录。它们被设置为允许访问计算机系统的普通用户以临时提升的权限执行二进制可执行文件。
查找//( -perm -2000 -o -perm -4000 /) -ls
167901 12 -rwsr-xr-x 1根根9340 2006年6月16日/usr/bin/rsh
167334 12 -rwxr-sr-x 1根tty 10532 May年5月4日/usr/bin/wall
在上面的命令中,您可以看到转义括号的使用。还可以看出权限的不同。第一个文件具有SGID权限集,第二个文件具有SUID权限集。上述命令中的最后一个操作类似于使用-exec ls -dils操作的find效果。
控制查找
与Linux中的许多命令不同,find可以在没有-r或-R选项的情况下进入子目录。默认情况下,它是这样操作的。但是,有时您可能希望限制这种行为。因此,选项-depth、-maxdepth和-mindepth以及操作-prune就派上了用场。
我们已经看到了西梅是多么有用。让我们看看-depth、-maxdepth和-mindepth选项。
-maxdepth和-mindepth选项允许您指定希望查找搜索深入到目录树的哪个级别。如果希望find只在目录的一个级别中查找,可以使用maxdepth选项。
通过运行以下命令在目录树的前三级中查找日志文件,可以看到-maxdepth的效果。使用此选项比不使用它产生的输出少得多。
find/-maxdepth 3 -name *log
您也可以让“查找”在目录树以下至少三层的目录中查找:
find/-mindepth 3 -name *log
-depth选项确保首先在目录中进行搜索,然后在子目录中进行搜索。以下命令提供了一个示例:
查找名称 *测试* -深度。/测试/测试。/测试。/localbin/test。/localbin/test_shell_var。/localbin/test.txt。/test2/test/test。/test2/test。/test2
世界发现
我们已经看到了find命令的一些更有用但有些困难的功能,但是find可以执行更多的任务。例如,有几个选项可以使find与早期的UNIX版本和其他操作系统兼容,并允许您打印到多个文件。阅读完本文后,您现在有了理解查找参考指南的背景。我鼓励您深入研究这个强大而有用的工具。
Sheryl Calish是专门研究Linux的IT顾问。她曾经就职于蓝鹭咨询公司,现在是EquityBuild的IT总监。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。