草庐IT

Linux命令之查找文件find

二木成林 2023-05-15 原文

概述

find 命令可以在目录层次结构中搜索符合指定条件的文件或目录,并且可以它们执行指定的操作。而搜索条件可以是文件权限、文件类型、日期、大小等。

语法

该命令的语法如下:

# find 命令从指定的起始目录开始,递归地搜索其各个子目录,查找满足条件的文件并对之采取相关的操作
find [指定起始目录] 查找条件 [操作]

该命令支持的选项有:

选项说明
-mount, -xdev只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件
-amin n在过去 n 分钟内被读取过
-anewer file比文件 file 更晚被读取过的文件
-atime n在过去 n 天内被读取过的文件
-cmin n在过去 n 分钟内被修改过
-cnewer file比文件 file 更新的文件
-ctime n在过去 n 天内创建的文件
-mtime n在过去 n 天内修改过的文件
-empty空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name
-ipath p, -path p路径名称符合 p 的文件,ipath 会忽略大小写
-name name, -iname name文件名称符合 name 的文件。iname 会忽略大小写
-size n文件大小 是 n 单位
-type c文件类型是 c 的文件

使用

按文件名查找文件

按文件名查找文件支持的选项有:

选项说明
-name <指定文件名>按指定文件文件名查找文件
-iname <指定文件名>按指定文件文件名查找文件,但忽略文件名的大小写

命令格式如下:

# 语法
find 指定起始目录 -name 指定文件名
# 示例
find /root/ -name test.txt 
find /root/ -iname TEST.txt

按扩展名查找文件

按扩展名搜索文件与按名称搜索文件相同,都是使用 -name 选项,但需要用到通配符 *,如要匹配所有以 .txt 后缀结尾的文件,就要写成 -name *.txt。如果要查与正则表达式不匹配的所有文件,可以加上 -not 选项,即如果要查找所有不以 .txt 后缀结尾的文件,就要写成 -not -name *.txt

选项说明
-not EXPR 不与正则表达式 EXPR 匹配的情况

语法如下:

# 语法
# 查找指定目录下所有以指定后缀结尾的文件
find 指定起始目录 -name *指定后缀
# 查找指定目录下所有不以指定后缀结尾的文件
find 指定起始目录 -not -name *指定后缀
# 示例
# 查找 /root/abc/ 目录下所有以 .txt 为后缀结尾的文件
find /root/abc/ -name *.txt
# 查找 /root/abc/ 目录下所有不以 .txt 为后缀结尾的文件
find /root/abc/ -not -name *.txt

按文件类型查找文件

有时您可能需要搜索特定文件类型,例如常规文件、目录或符号链接。在 Linux 中,一切都是文件。要根据文件类型搜索文件,请使用 -type 选项和以下描述符之一来指定文件类型:

文件类型描述符说明
f一个普通文件
d目录
l符号链接
c字符设备
b块设备
pFIFO
ssocket 文件

语法格式如下:

# 语法
find 指定起始目录 -type 文件类型描述符 
# 示例,查找 /root/abc/ 目录下所有普通文件
find /root/abc/ -type f

按大小查找文件

要根据文件大小查找文件,使用 -size 选项与大小标准一起传递。可以使用以下后缀来指定文件大小:

文件大小标识后缀说明
b512字节块,默认
c字节
w两字节
k千字节
M兆字节
G千兆字节

我们可以查找文件大小恰好等于、小于或大小指定大小的文件,其命令格式如下:

# 语法
find 指定起始目录 -size [+-]大小[文件大小标识后缀]
# 示例
# 在 /root/ 目录下查找文件大小等于 10 字节的文件
find /root/ -size 10c
# 在 /root/ 目录下查找文件大小小于 1MB 的文件,其中减号表示小于
find /root/ -size -1M
# 在 /root/ 目录下查找文件大小大于 1MB 的文件,其中加号表示大于
find /root/ -size +1M
# 在 /root 目录下查找文件大小在 1MB 和 21MB 之间的文件
find /root -size +1M -size -21M

注:

  • +20 表示 20 之后,如 21、22、23 等。
  • -20 表示 20 之前,如 19、18、17 等。
  • 20 表示恰好是 20。

按时间查找文件

我们可以通过文件的修改时间和访问时间来查找文件,跟文件时间有关的选项有:

选项说明
-amin N查找 N 分钟前被访问过的所有文件
-atime N查找 N 天前被访问过的所有文件
-cmin N查找 N 分钟前文件状态被修改过的所有文件
-ctime N查找 N 天前文件状态被修改过的所有文件
-mmin N查找 N 分钟前文件内容被修改过的所有文件
-mtime N查找 N 天前文件内容被修改过的所有文件

示例如下:

# 查找 /root/ 目录下 3 天前文件内容被修改过的文件
find /root/ -mtime 3 

按权限查找文件

如果想要根据权限来查找文件,那么得使用 -perm 选项:

# 语法
find 指定起始目录 -perm 表示权限的数字
# 示例,查找 /root/ 目录下所有具有可读可写可执行权限的文件
find /root/ -perm 777

按所有者查找文件

如果我们要查找指定所有者或所属组的文件,那么可以使用以下选项:

选项说明
-gid N查找组 id 是 N 的所有文件
-uid N查找用户 id 是 N 的所有文件
-group 组名查找属于指定用户组的所有文件
-user 用户名查找属于指定用户的所有文件

示例如下:

# 查找 /root/ 目录下所有属于用户 zs 的文件
find /root/ -user zs

逻辑运算符组成的复合条件

该命令还支持用逻辑运算符 notandor 组成的复合条件。各逻辑运算符说明如下:

逻辑运算符说明举例例子说明
and逻辑与,在命令中用选项 -a 表示,是默认选项,表示当所有条件都满足时,查找条件才匹配find /root/ -name test.txt -user 'zs'查找 /root/ 目录下文件名为 test.txt 并且是 zs 创建的文件
or逻辑或,在命令中用选项 -o 表示,表示当只要有一个条件被满足时,查找条件就匹配find /root/ -name test.txt -o -user 'zs'查找 /root/ 目录文件名为 test.txt 或者是由 zs 创建的文件
not逻辑非,在命令用 ! 表示,表示查找不满足给定条件的文件find /root/ ! -name test.txt查找 /root 目录下所有文件名不少 test.txt 的文件

注:当由多个逻辑选项时,可以用括号把这些逻辑选项括起来。但为了避免 Shell 本身对括号引起误解,在话号前需要加转义字符 \ 来去除括号的意义。例:find /root/ \(-name test.txt -user 'zs' \)

对找到的文件执行操作

我们可以对找到的文件直接执行操作,那么支持的选项有:

选项说明
-exec 命令名称 {} \;对符合条件的文件执行所给的Linux 命令,而不询问用户是否需要执行该命令。{} 表示命令的参数即为所找到的文件;命令的末尾必须以 \; 结束。
ok 命令名称 {} \;对符合条件的文件执行所给的Linux 命令,与exec不同的是,它会询问用户是否需要执行该命令。

示例如下:

# 在 /root/ 目录下查找文件名为 test.txt 文件,找到之后统计该文件的行数
find /root/ -name test.txt -exec wc -l {} \;

查找隐藏文件

在 Linux 系统中凡是文件名或目录名是以 . 开头的都是隐藏文件。通过 ls 命令是看不到的,必须通过 ls -a 才能看到这些隐藏的文件。

如果只是通过 find 命令是会找出所有文件的,包括隐藏文件和非隐藏文件。但有时候如果我们想要只查找隐藏或只查找非隐藏文件,就必须结合 grep 命令一起使用才能达到想要的效果。因为隐藏文件是 . 开头的,所以根据这个特性,用正则表达式去匹配,但是在正则表达式中 . 是有特殊含义的,所以要进行转义 \.。命令格式如下:

# 只查找指定目录下的所有隐藏文件
# `\.` 表示匹配普通的点字符 `.`;而 `\` 又是特殊字符需要进行转义就是 `\\.`;而由于 find 命令查询的结果是文件路径,所以隐藏文件的点字符的前一个字符是 `/`
find 指定目录 -type f | grep "/\\."
# 示例,查找 /home 目录下的所有隐藏文件
find /home -type f | grep "/\\."

# 只查找指定目录下的所有非隐藏文件
# `\.` 表示匹配普通的点字符 `.`;而 `\` 又是特殊字符需要进行转义就是 `\\.`;而由于 find 命令查询的结果是文件路径,所以隐藏文件的点字符的前一个字符是 `/`
# -v 选项表示除匹配项之外的所有项
find 指定目录 -type f | grep -v "/\\."
# 示例,查找 /home 目录下的所有隐藏文件
find /home -type f | grep -v "/\\."

参考资料:

有关Linux命令之查找文件find的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  8. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  9. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  10. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

随机推荐