Linux find基础

搜索文件在使用操作系统中是非常频繁的操作,一个系统中可能有成千上万的文件,怎么快速找到想要的文件是提升效率的关键。Linux中我们可以使用强大的find命令。find命令可以说是Linux中最常用也最复杂的命令,特别是和其他命令一起执行的时候。由于find具有强大的功能,所以它的选项也非常多,其中大部分都值得我们花时间了解一下。

find命令的一般形式

find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]

上面的find命令可以简化为:

find pathname -options [-print -exec -ok ... action]

命令参数:

pathname: find命令所要查找的目录路径。例如用 . 表示当前目录,用 / 表示根目录

-print: 将find命令匹配到的文件输出到标准输出
-exec: 将find命令匹配到的文件执行该参数指定的shell命令。相应的命令形式为 'command' {};
-ok: 和 -exec 相同,只不过更安全

find命令最简单的使用是,搜索一个或多个目录。

$ find .
.
./.android
./.android/adbkey
./.android/adbkey.pub
./.android/androidwin.cfg
./.android/avd
./.android/cache
./.android/cache/api-versions-6.bin
[...]
$
$ find / 
/
find: /.fseventsd: Permission denied
/.MobileBackups
find: /.MobileBackups: Permission denied
/.OSInstallerMessages
/.PKInstallSandboxManager
/.PKInstallSandboxManager-SystemSoftware
/.vol
/Applications
/Applications/.DS_Store
/Applications/.localized
/Applications/Adobe Application Manager
/Applications/Adobe Photoshop CC 2014
/Applications/Adobe Photoshop CC 2014/Adobe Photoshop CC 2014.app
[...]
$

也可以一次搜索多个目录:

$ find . /
[...] // 输出结果太多,省略

如果仅仅只是列出某个目录的所有文件就感受不到find的强大。find可以通过组合各种选项来组成搜索条件来完成搜索,而且还可以运用各种相关的操作。

测试条件

我们可以根据文件类型来搜索。find支持的文件类型如下(-type 参数):

文件类型 描述
b 块设备文件
c 字符设备文件
d 目录
f 普通文件
l 符号链接

比如我们只想搜索某个目录下面所有的子目录:

$ find . -type d 
.
./.android
./.android/avd
./.android/cache
./.atom
./.atom/.apm
./.atom/.apm/_locks
./.atom/.apm/atom-autocomplete-php
./.atom/.apm/atom-autocomplete-php/0.18.9
./.atom/.apm/atom-autocomplete-php/0.18.9/package
[...]
$

我们也可以只搜索某个目录下的普通文件:

$ find ~ -type f | wc -l
868386
$

也可以根据文件大小来搜索(-size 参数):

字符 单位
b 512个字节块。如果没有指定单位,则这是默认值。
c 字节
w 两个字节的字
k 千字节(1024字节)
M 兆字节(1048576字节)
G 千兆字节(1073741824字节)

我们可以搜索目录下面文件大小大于1G的文件:

$ find ~ -type f -size +1G
/Documents/Virtual Machines.localized/Windows 10 x64 2.vmwarevm/Virtual Disk-s001.vmdk
./Documents/Virtual Machines.localized/Windows 10 x64 2.vmwarevm/Virtual Disk-s002.vmdk
./Documents/Virtual Machines.localized/Windows 10 x64 2.vmwarevm/Virtual Disk-s003.vmdk
[...]
$

上面的例子使用了文件类型和文件大小一起作为搜索的测试条件,只有文件类型是普通文件而且大小大于1G的文件才会被搜索到。我们也可以再增加搜索条件:

$ find ~ -type f -name "*.png" -size +1M | wc -l
5543
$

上面的例子中我们使用了-name测试条件,后面跟通配符模式。注意我们使用双引号括起来,是为了阻止bash展开星号。上面的测试条件是找到文件名以png结尾,并且是普通文件类型的文件,而且文件大小要大于1M。如果在数字参数前面加上+或者-则表示大于或者小于指定数。

find的其他测试条件,下面是一些常见的测试条件,在数值参数的前面可以使用+或者-

测试条件 描述
-cmin n 匹配的文件和目录的内容或属性最后修改时间正好在 n 分钟之前。 指定少于 n 分钟之前,使用 -n,指定多于 n 分钟之前,使用 +n。
-cnewer file 匹配的文件和目录的内容或属性最后修改时间早于那些文件。
-ctime n 匹配的文件和目录的内容和属性最后修改时间在 n*24小时之前。
-empty 匹配空文件和目录。
-group name 匹配的文件和目录属于一个组。组可以用组名或组 ID 来表示。
-iname pattern 就像-name 测试条件,但是不区分大小写。
-inum n 匹配的文件的 inode 号是 n。这对于找到某个特殊 inode 的所有硬链接很有帮助。
-mmin n 匹配的文件或目录的内容被修改于 n 分钟之前。
-mtime n 匹配的文件或目录的内容被修改于 n*24小时之前。
-name pattern 用指定的通配符模式匹配的文件和目录。
-newer file 匹配的文件和目录的内容早于指定的文件。当编写 shell 脚本,做文件备份时,非常有帮助。 每次你制作一个备份,更新文件(比如说日志),然后使用 find 命令来决定自从上次更新,哪一个文件已经更改了。
-nouser 匹配的文件和目录不属于一个有效用户。这可以用来查找 属于删除帐户的文件或监测攻击行为。
-nogroup 匹配的文件和目录不属于一个有效的组。
-perm mode 匹配的文件和目录的权限已经设置为指定的 mode。mode 可以用 八进制或符号表示法。
-samefile name 相似于-inum 测试条件。匹配和文件 name 享有同样 inode 号的文件。
-size n 匹配的文件大小为 n。
-type c 匹配的文件类型是 c。
-user name 匹配的文件或目录属于某个用户。这个用户可以通过用户名或用户 ID 来表示。

操作符

上面的测试条件只是一部分,限于篇幅只能列出笔记常用的。那么这么多测试条件如果都并列写在一起将不便于阅读。所以find提供了逻辑操作符来创建复杂的测试条件,也便于阅读和维护。逻辑操作符如下:

操作符 描述
-and 如果操作符两边的测试条件都是真,则匹配。可以简写为 -a。 注意若没有使用操作符,则默认使用 -and。
-or 若操作符两边的任一个测试条件为真,则匹配。可以简写为 -o。
-not 若操作符后面的测试条件是真,则匹配。可以简写为一个感叹号(!)。
() 把测试条件和操作符组合起来形成更大的表达式。这用来控制逻辑计算的优先级。

注意,find命令从左往右计算,而且要注意圆括号在bash中要转义

我们可以使用上面的逻辑操作符来构造复杂的测试条件,例如只查找特定某些文件:

find . \(-name "*.pdf" -or -name "*.txt"\)

上面的例子会打印当前目录下以.txt.pdf结尾的文件名。也可以找出目录下不是pdf的普通文件:

find . ! -name "*.pdf"

逻辑操作符可以描述为下面的简短形式。逻辑操作符还有一种和其他编程语言相同的特性:短路。下面是逻辑操作符的执行情况:

expr1 -operator expr2

expr1的结果 操作符 expr2的执行情况
-and 总要执行
-and 从不执行
-or 从不执行
-or 总要执行

预定义操作

find除了可以根据特定条件搜索文件外,还可以在搜索到文件之后根据搜索结果执行预定义的操作。find预定义的常用的操作如下表:

操作 描述
-print 把匹配文件的全路径名输送到标准输出。如果没有指定其它操作,这是 默认操作。
-delete 删除匹配到的文件
-ls 对匹配到的结果执行 ls -dils 命令,然后将结果输出到 STDOUT
-quit 一旦找到一个匹配,就退出

find .

会输出当前目录的所有文件和子目录,这相对于:

find . -print

也可以使用-delete来删除搜索到的文件和目录:

find . -empty -delete
find . -type f -name '*.txt' -delete

上面的第一条命令会删除当前目录下的空目录和空文件,第二条命令会删除当前目录下面所有的txt文件。( 好像例子不是太好:( )
当使用-delete时得特别小心,可以先用print输出看看里面有没有不能删除的文件

自定义操作

find除了可以使用预定义的操作之外,还可以通过-exec来自定义操作:

find path [expression] -exec command {} ;

上面的-exec是表示自定义操作的开始,command就是shell命令的名字,{}是当前路径名的符号表示,分号是命令结束的标志。

find . -type f -name "*.zip" -size +100M -exec rm {} \;

删除当前目录下大于100M的压缩文件。上面命令中的{}代表find找到的文件路径,find的结果会放到{}位置之中作为rm的参数。

find . -type f -name ".pdf" -exec ls -l {} \;

上面的命令用于输出当前目录下所有的pdf文件详情。当使用-exec时,每找到一个匹配就会执行一次-exec后面的命令。有时候我们可能希望将find的结果作为一个整体然后再运行额外的命令,这个时候就可以使用外部命令xargsxargs从标准输入接受输入,并把输入转换为一个特定命令的参数列表,这样命令就不用每匹配到一个文件或目录就执行一次。

find ~ type f -name "*.pdf" | xargs ls -l

因为xargs接受标准输入,所以把find的结果用管道(pipe)到xargs的输入,xargs会把输入构造为ls的参数列表,然后执行ls命令。这种方式比-exec方式快很多,ls执行的次数远远小于-exec的匹配到文件就执行一次命令。
xargs后面的命令并不是只执行一次,这取决于输入的参数的个数,如果超过了bash能够处理的最大长度,xargs会使用最大的参数长度执行后面的命令,然后重复这个过程,直到所有的输入都执行完。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,022评论 2 34
  • 在linux下面工作,有些命令能够大大提高效率。本文就向大家介绍find、grep命令,他哥俩可以算是必会的lin...
    拿破轮胎阅读 935评论 0 4
  • Linux下find命令在目录结构中搜索文件,并执行指定的操作。Linux下find命令提供了相当多的查找条件,功...
    很少更新了阅读 381评论 0 0
  • 1 杨馨终于如愿以偿嫁给了汪明。 汪家很有钱,在本市有一家上市公司,两套别墅,好几辆豪车。 结婚之后,杨馨就搬进了...
    梦见桃花源璐璐阅读 1,501评论 1 5
  • 我:要是我有文笔写点文章赚赚外快也好… 你:这是可怕的工作。 灵感一来,通宵达旦,废寝忘食。 闭门不出,浪费的不只...
    乔和阅读 140评论 0 0