linux下定位文件的常用命令 linux 定位文件
ahcoder 2024-12-23 08:36 11 浏览
"find(1)是一种非常有用的shell脚本命令,但它往往被人们理解得不够透彻。这部分原因在于其复杂的语法(可以说是所有标准Unix命令中最复杂的,除了像awk这样的编程语言);另一部分原因在于手册页写得不好。在继续之前,你应该首先阅读一下系统中关于find命令的手册页。你不需要记住它,也不需要理解每个部分,但至少要浏览一遍,对整体有个大致的了解。然后,你可能会想查看OpenBSD的手册页进行对比。有时候,你会对某个手册页的理解更胜一筹。只要认识到不同实现并不相同;OpenBSD版可能具有你所缺乏的功能,反之亦然。但许多人发现BSD的手册页易于阅读,所以它可能对你理解概念有所帮助。
接下来,我们来谈谈find的作用,以及何时、如何使用它。
概述
这是基本思想:find向下遍历文件层级结构,匹配满足指定条件的文件,然后对它们执行操作。这非常重要,所以我再写一遍:
find向下遍历文件层级结构,
匹配满足指定条件的文件,然后
对它们执行操作。
让我们举几个快速示例,来说明它的基本操作。首先:
find .
.
./bar
./bar/foo.jpg
./foo.mp3
./apple.txt
如果你没有为当前目录指定".",一些版本的find会默认使用当前目录;其他版本可能会生成错误。你应该始终指定要遍历的目录。
如果你没有指定任何文件匹配的条件,find将匹配每个文件(包括目录、符号链接、块设备、字符设备、FIFO、套接字等等)。在我们的第一个示例中,我们没有添加任何标志,因此匹配了所有文件和目录。
最后,如果你没有指定要在每个匹配的文件上执行的操作,大多数现代版本的find会默认打印它们的名称到标准输出,并在每个文件名后加上换行符。(某些极旧的find版本可能什么也不做——最好明确指定操作。)如果我们想明确指定,可以这样写:
find . -print
这将产生与之前看到的相同的输出;我就不重复了。
你可能还观察到,find的输出不像ls(1)那样按字母顺序排序。它只是按照文件在目录中的出现顺序给出文件列表。"
基于名称搜索
现在,让我们应用一个过滤选项。假设我们只想找到以.jpg结尾的文件:
find . -name '*.jpg' -print
./bar/foo.jpg
在这种情况下,只有一个文件符合我们的条件,所以我们只得到一行输出。注意,find使用通配符来表示文件名匹配模式。还要注意,我们必须引用通配符,以防止shell对其进行扩展。我们希望find不要进行扩展,以便find可以将其应用于发现的每个文件名。
如果我们还想找到所有以.mp3结尾的文件:
find . \( -name '*.mp3' -o -name '*.jpg' \) -print
./bar/foo.jpg
./foo.mp3
这比我们之前展示的稍微复杂一些,所以让我们详细解释一下。核心部分是这样的:
-name '*.mp3' -o -name '*.jpg'
这简单地表示"我们要符合这个或者那个条件的文件"。-o是逻辑上的"或"运算符,并且是最常用的写法(某些其他版本的find也支持-or,但为什么要使用非便携标志,而且还要多敲击键呢?)。
我们用括号括起整个"或"表达式,因为我们希望它被视为一个单个单元,特别是当我们开始将其与其他表达式链接在一起时(正如我们将要做的那样)。括号本身必须完整传递给find,所以我们必须用反斜杠保护它们,因为括号对于shell也有特殊含义。我们还可以使用引号将括号括起来,而不是使用反斜杠。
最后,我们应用了显式的-print操作。满足我们条件的任何文件都会打印出它们的名称。
如果您想让文件满足多个条件,可以指定多个标志。只要将两个过滤器放在一起而没有-o在它们之间,就会隐含一个逻辑上的"与":
find . -name '*.mp3' -name '*.jpg' -print
这个命令不产生输出,因为我们要求所有以.mp3结尾并且以.jpg结尾的文件。显然,没有文件能同时满足这两个条件,所以我们什么也没得到。
现在,让我们像之前承诺的那样链接一个"或"和一个隐含的"与":
find . \( -name '*.mp3' -o -name '*.jpg' \) -name 'foo*' -print
./bar/foo.jpg
./foo.mp3
这里,我们与之前相同的"或"表达式:文件的名称必须以.mp3或.jpg结尾。此外,它的名称必须以foo开头。结果被显示出来。
注意,-name只匹配最深层目录中的文件名——在我们的示例中,是foo.jpg而不是foo/bar.jpg或./foo/bar.jpg。这就是为什么-name 'foo*'筛选器能够匹配它的原因。如果我们想查看目录名,我们必须使用-path筛选器:
find . -path 'bar*' -print
这将不会产生任何输出。为什么?请看这里:
find . -path './bar*' -print
./bar
./bar/foo.jpg
-path检查整个路径名,其中包括文件名(也就是你在find的-print输出中看到的内容),以便进行匹配。这也包括我们示例中的前导./。
(此时,我必须指出-path在每个find版本上都不可用。特别是,Solaris没有它。但在其他大多数系统中很常见。)
我们还可以对表达式取反:
griffon:/tmp/greg$ find . ! -path '*bar*' -print
.
./foo.mp3
./apple.txt
!取反后面的表达式,所以我们得到了每个不带bar的文件的完整路径名。
根据时间进行搜索
find最常见的用法之一是查找所有早于某个时间点的文件,例如相对于当前时间的"30天前"或其他文件。如果我们想要找到所有30天前修改过的文件(例如清理临时目录),我们可以使用:
find /tmp -mtime +30 -print
-mtime标志是用于检查文件时间戳的三个筛选器之一。Unix文件系统上的文件有三个时间戳:修改时间(mtime)、访问时间(atime)和更改时间(ctime)。没有地方存储文件的创建时间。
再次强调一下,对于那些不注意听的人:无法知道文件的创建时间。这个信息没有存储在任何地方。(除非在非标准文件系统上,只有在那些系统上才可能存储该信息。)
- ext4和其他文件系统具有文件创建时间戳,但我不确定是否有任何find或stat支持它。(注:有。)
- (注:随着时间的推移,任何通用的现代文件系统都会有创建时间 - ext4、xfs、zfs等等。只需注意,因为在某些文件系统上是ctime,而在其他文件系统上是crtime,在btrfs上是otime等等)
- 并非所有当前使用的系统都是"现代化"的。许多应用程序运行在旧系统上。创建时间不是一个通用的特性。如果您的脚本只运行在具有该特性的系统上,那么可以放心使用它。但是如果将您的软件迁移到不同的平台上,请不要指望它存在。
在我们的示例中,我们使用了-mtime来查看文件的修改时间。这是我们运行ls -l时看到的时间戳,也是最常用的时间戳。每当通过写入更改文件内容时,它都会被更新。我们也可以使用-atime来查看文件的访问时间--这可以通过ls -lu看到,并且在文件被读取时更新(除非系统管理员在该文件系统上明确关闭了atime更新)。很少使用ctime(更改时间),它在文件元数据(权限、所有权等)发生更改时更新(例如,通过chmod命令)。
"+30"表示我们想要获取所有超过30天的文件。如果我们使用以下命令:
find . -mtime 30 -print
我们将得到所有恰好30天前(向最近一天四舍五入)的文件(具体定义请参阅手册)。这通常不太有用。然而,如果我们想要获取在过去30天内修改过的所有文件,我们可以使用以下命令:
find . -mtime -30 -print
这将给出所有修改时间在30天之内的文件。
一些find命令版本还具有-mmin、-amin和-cmin参数,允许以分钟为单位进行时间测量。这样可以查找例如在最近30分钟内修改过的所有文件。这些标志不属于POSIX标准,但它们存在于许多GNU和BSD系统中。
另一个根据时间匹配文件的常见用途是当我们想要查找自上次检查以来已修改过的所有文件时。该逻辑如下所示:
find /etc -newer /var/log/backup.timestamp -print
touch /var/log/backup.timestamp
这是进行增量系统备份的基本结构:查找自上次备份以来发生更改的所有文件,然后更新我们的时间戳文件以供下一次运行使用。(显然,为了进行有意义的备份,我们需要执行更多操作而不仅仅是-print显示文件,但我们将在接下来的部分中深入研究操作。)
学习更多shell有用知识
如果您觉得文章内容对你有一点帮助可以关注我,我在头条平台会持续分享更多实用的shell技巧和最佳实践,如果想系统的快速学习shell的各种高阶用法和生产环境避坑指南可以看看《shell脚本编程最佳实践》专栏,专栏里有更多的实用小技巧和脚本代码分享。
相关推荐
- PC也能装MAX OS X
-
MACBOOK向来以其时尚的外观以及易用的OSX操作系统成为了时(zhuang)尚(bi)人士的最爱。但是其动不动就上万元的昂贵价格,也将一批立志时(zhuang)尚(bi)人士的拒之门外。但是最近...
- 一千多元的笔记本能买吗?英特尔11代+大屏幕,豆小谷值得选吗?
-
前言:有很多粉丝都问过本人,一千多元到底能买到什么样的笔记本?在此笔者只想说,这样的资金预算真的太低了!如果想买全新的,那大概率买的就是性能比较拉垮的上网本,比如搭载英特赛扬N系列、J系列处理器的轻薄...
- 首款配备骁龙X Elite处理器的Linux笔记本:采用KDE Plasma桌面环境
-
德国Linux硬件供应商TUXEDOComputers宣布正在开发一款配备高通骁龙XElite处理器(SnapdragonXEliteSoC)的ARM笔记本电脑,内部将该...
- System76推出Gazelle Linux笔记本:配酷睿i9-13900H处理器
-
IT之家3月30日消息,主打Linux硬件的厂商System76于今天发布了新一代Gazelle笔记本电脑,共有15英寸和17英寸两个版本,将于3月30日接受预订,...
- Kubuntu Focus Xe Gen 2笔记本发布,预装Linux系统
-
IT之家3月25日消息,KubuntuFocusXeGen2笔记本于近日发布,这是一款预装Kubuntu22.04LTSGNU/Linux发行版的轻薄本。上一代Kub...
- 这台Linux笔记本已用上英特尔12代酷睿,最高可选i7-1255U、卖1149美元起
-
Linux笔记本可能因为比较小众,一般都是拿Windows笔记本换个系统而来,硬件上也会落后同期Windows笔记本一两代,不过现在专门做Linux电脑的System76,推出了一款名为LemurP...
- 戴尔Inspiron 14 Plus骁龙笔记本迎新补丁,支持启动Linux
-
IT之家4月25日消息,科技媒体phoronix今天(4月25日)发布博文,报道称最新发布的Linux内核补丁,针对骁龙芯片的戴尔Inspiron14Plus笔记本,让其...
- TUXEDO推出InfinityFlex 14二合一Linux笔记本,配i5-1335U
-
IT之家8月12日消息,Linux硬件企业TUXEDO当地时间本月2日推出了InfinityFlex14二合一Linux笔记本。该笔记本搭载2+8核的英特尔酷睿i5-...
- 登月探测器嫦娥使用什么操作系统,是Linux还是其它自主研发?
-
这是不是国家机密啊。事实什么样的不知道,但是从美国的探测器来看,就算不是也是相似的东西。下面我来说说我知道的。龙芯已经随北斗卫星上天了.就算登月探测器嫦娥是用"龙芯+Linux"也不出奇.没必要...
- DNS分离解析实验
-
如果本文对你有帮助,欢迎关注、点赞、收藏、转发给朋友,让我有持续创作的动力目录一、分离解析概述二、实验需求三、实验步骤3.1双网卡服务器配置3.1.1添加两张网卡(内外网)3.1.2对两个网卡进...
- 一个小实验巩固下进程管理
-
先回顾下之前的三篇文章:Linux进程在内核眼中是什么样子的?Linux进程线程是如何创建的?Linux是如何调度进程的?通过这三篇文章的学习我们知道,无论内核进程还是用户进程,都是可以用task...
- VMware Kali无线WIFI密码破解
-
WIFI破解前准备工作一张支持Kali系统监听的无线网卡VMware虚拟机安装好Kali系统(本实验用的是Kali2022版本)Kali系统下载、安装官方网站:https://www.kali.or...
- python多进程编程
-
forkwindows中是没有fork函数的,一开始直接在Windows中测试,直接报错importosimporttimeret=os.fork()ifret==0:...
- 拔电源十台电脑藏后门!德国实验惊曝Windows致命漏洞
-
2025年4月15日,央视突然曝出一个超级大新闻!原来美国国家安全局通过黑龙江,往微软Windows系统里发送加密信息,激活了系统里藏着的后门程序,想破坏哈尔滨亚冬会!这消息一出来,大家才发现,竟然已...
- 深度探索RK3568嵌入式教学平台实战案例:设备驱动开发实验
-
一、产品简介TL3568-PlusTEB人工智能实验箱国产高性能处理器64位4核低功耗2.0GHz超高主频1T超高算力NPU兼容鸿蒙等国产操作系统二、实验目的1、熟悉基本字符设备的驱动程序...
- 一周热门
- 最近发表
-
- PC也能装MAX OS X
- 一千多元的笔记本能买吗?英特尔11代+大屏幕,豆小谷值得选吗?
- 首款配备骁龙X Elite处理器的Linux笔记本:采用KDE Plasma桌面环境
- System76推出Gazelle Linux笔记本:配酷睿i9-13900H处理器
- Kubuntu Focus Xe Gen 2笔记本发布,预装Linux系统
- 这台Linux笔记本已用上英特尔12代酷睿,最高可选i7-1255U、卖1149美元起
- 戴尔Inspiron 14 Plus骁龙笔记本迎新补丁,支持启动Linux
- TUXEDO推出InfinityFlex 14二合一Linux笔记本,配i5-1335U
- 登月探测器嫦娥使用什么操作系统,是Linux还是其它自主研发?
- DNS分离解析实验
- 标签列表
-
- linux 远程 (37)
- u盘 linux (32)
- linux 登录 (34)
- linux 路径 (33)
- linux 文件命令 (35)
- linux 是什么 (35)
- linux 界面 (34)
- 查看文件 linux (35)
- linux 语言 (33)
- linux代码 (32)
- linux 查看命令 (33)
- 关闭linux (34)
- root linux (33)
- 删除文件 linux (35)
- linux 主机 (34)
- linux与 (33)
- linux 函数 (35)
- linux .ssh (35)
- cpu linux (35)
- 查看linux 系统 (32)
- linux 防火墙 (33)
- linux 手机 (32)
- linux 镜像 (34)
- linux mac (32)
- linux ip地址 (34)