草庐IT

【linux find命令】在目录中查找文件并删除文件

sodaloveer 2023-10-27 原文

文章目录


find命令格式

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

find有两个参数:

  • pathname,第一个参数用来指定搜索路径。
  • options,第二个参数用来指定搜索内容。

find命令搜索不建议过大的搜索范围,会消耗较大的系统资源,导致服务器压力过大。

一、按文件名搜索

find 搜索路径 【选项】 搜索内容

选项:

  • -name:按文件名搜索
  • -iname:按文件名搜索,不区分文件名大小
  • -inum: 按inode号搜索

举例说明:

  • name
# 搜索的文件名必须和你的搜索内容一致才能找到。如果只包含搜索内容,则不会找到。
[wqf@b1i10 rm_test]$ find ./ -name test_3.txt
./test_3.txt
  • iname

Linux 中的文件名是区分大小写的,也就是说,搜索小写文件,是找不到大写文件的。

# 不区分文件名大小写,用iname
[wqf@b1i10 rm_test]$ find ./ -iname test_3.txt
./TEST_3.TXT
./test_3.txt
  • inum

每个文件都有 inode 号,如果我们知道 inode 号,则也可以按照 inode 号来搜索文件。

# 如果知道文件名,用"ls -i"来査找inode号
[wqf@b1i10 rm_test]$ ls -i test_3.sh
29884450 test_3.sh
# 如果知道inode号,则可以用find命令来査找文件
[wqf`在这里插入代码片`@b1i10 rm_test]$ find ./ -inum 29884450
./test_3.sh

基于目录深度搜索
find 命令是递归遍历文件夹,列出当前目录及子目录下所有文件

命令 " find ./ -name "*.txt" "  ,./ 路径下列出当前目录及子目录下以.txt结尾的文件。

如果想不递归查找文件夹,只要当前目录下的符合搜索范围的文件。

命令 " find ./ -maxdepth 1 -name "\*.txt"   " ,./ 当前目录下查找以.txt结尾的文件,-maxdepth 1表示查找深度为1。

如果想搜索当前目录下面至少2个子目录的所有文件

命令 " find ./ -mindepth 2 -name "\*.txt"  "  

二、按文件大小搜索

find 搜索路径 【选项】 搜索内容

选项:

  • -size[+-]大小:按照指定大小搜索文件
    “+“的意思是搜索比指定大小还要大的文件,”-” 的意思是搜索比指定大小还要小的文件。

find 默认的单位是512Byte,如果单位为b或不写单位,则按照 512Byte搜索,其他大小搜索单位如下:

'c' for bytes
 #搜索单位是c,按照字节搜索
'w' for two-byte words
#搜索单位是w,按照双字节(中文)搜索
'k'for Kilobytes (units of 1024 bytes)
#按照KB单位搜索,必须是小写的k
'M' for Megabytes (units of 1048576 bytes)
#按照MB单位搜索,必须是大写的M
'G' for Gigabytes (units of 1073741824 bytes)
#按照GB单位搜索,必须是大写的G

举例说明:

# 当前目录下面有一个大小是2M的文件
[wqf@b1i10 rm_test]$ ls -l --block-size=M mon_tj_cal.txt
-rw-rw-r-- 1 summary_fz_province summary_fz_province 2M Dec  2 12:53 mon_tj_cal.txt

# 当前目录下,查找大小刚好2M的文件,可以找到
[wqf@b1i10 rm_test]$ find ./ -size 2M
./mon_tj_cal.txt

# 搜索小于2M的文件,可以找到很多其他文件
[wqf@b1i10 rm_test]$ find ./ -size -2M
./
./mon_tj_cal.sh
./file.patch
./test_3.sh
./file1.txt
./newtest1
./4.sh
./TEST_3.TXT
./test.txt
./testfile.txt
./1.txt
./test_3.txt
./newtest2
./execute_test.sh
./file2.txt
./test_1.sh
./mon_tj_cal_1.sh
./test_2.sh

三、按修改时间搜索

find 搜索路径 【选项】 搜索内容

选项:

  • -atime[+-]时间:按文件访问时间搜索,记录文件最后一次被访问的时间。
  • mtime[+-]时间:按文件数据修改时间搜索,当对这个文件内容进行修改后,modify显示的时间就会更新一次。
  • ctime[+-]时间:按文件状态修改时间搜索,当文件内容、更改文件权限,链接属性时随文件inode更改而改变的时间。

以mtime来举例 “[±]” 时间的含义。
-5:代表 5 内修改的文件。
5:代表前 5~6 天那一天修改的文件。
+5:代表 6 天前修改的文件。

# 查找6天前修改的文件
[wqf@b1i10 rm_test]$ find ./ -mtime +5
./mon_tj_cal.sh
./newtest1
./4.sh
./test.txt
./testfile.txt
./1.txt
./mon_tj_cal.txt
./newtest2
./gz_silence_val_1.sh
./execute_test.sh
./mon_tj_cal_1.sh

# 查找5天内修改过的文件
[wqf@b1i10 rm_test]$ find ./ -mtime -5
./
./test_3.sh
./TEST_3.TXT
./test_3.txt
./test_1.sh
./test_2.sh

# 查找 5~6 天那天修改的文件
[wqf@b1i10 rm_test]$ find ./ -mtime 5
./file.patch
./file1.txt
./file2.txt

四、按文件类型搜索

find 搜索路径 【选项】 搜索内容

选项:

  • -type d:查找目录
  • -type f:查找普通文件
  • -type l:查找软链接文件

举例说明:

# 查找./目录下面有哪些子目录
[wqf@b1i10 zxt_test]$ find ./ -type d
./
./take_data
./make_data
./drop_tables
./drop_tables/history
./drop_tables/test
./rm_test
./python
./push_data

五、按权限搜索

find 搜索路径 【选项】 搜索内容

选项:

  • -perm 权限模型:查找文件权限刚好等于“权限模型”的文件
  • -perm -权限模式:査找文件权限全部包含"权限模式"的文件
  • -perm /+权限模式:査找文件权限包含"权限模式"的任意一个权限的文件

Linux下文件的权限类型一般包括读,写,执行。对应字母为 r、w、x。我们规定 数字 4 、2 和 1表示读、写、执行权限(具体原因可见下节权限详解内容),即 r=4,w=2,x=1 。
Linux下权限的粒度有 拥有者 、群组 、其它组 三种。每个文件都可以针对三个粒度,设置不同的rwx(读写执行)权限

举例说明:

# 测试
[wqf@b1i10 test]$ touch test_1.sh test_2.sh test_3.sh test_4.sh
[wqf@b1i10 test]$ chmod 200 test_1.sh (只有拥有者有写的权限。)
[wqf@b1i10 test]$ chmod 444 test_2.sh (所有用户只拥有读的权限。)
[wqf@b1i10 test]$ chmod 600 test_3.sh (只有拥有者有读写权限。)
[wqf@b1i10 test]$ chmod 755 test_4.sh (拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。)

# 查看权限
[wqf@b1i10 test]$ ll
total 0
--w------- 1 wqf wqf 0 Jan 10 15:13 test_1.sh
-r--r--r-- 1 wqf wqf 0 Jan 10 15:13 test_2.sh
-rw------- 1 wqf wqf 0 Jan 10 15:13 test_3.sh
-rwxr-xr-x 1 wqf wqf 0 Jan 10 15:13 test_4.sh

# 按照指定权限搜索文件,文件的权限必须和搜索指定的权限一致,才能找到
[wqf@b1i10 test]$ find ./ -perm 200
./test_1.sh
[wqf@b1i10 test]$ find ./ -perm 444
./test_2.sh

# "-perm-权限模式":必须完全包含。
# 因为 test_1.sh 的权限是200--w-------)、test_3.sh 的权限600-rw-------)、test_4.sh 的权限755-rwxr-xr-x),所以可以找到;而test_2.sh的权限是(-r--r--r--),不包括200--w-------)权限,所以找不到。
[wqf@b1i10 test]$ find ./ -perm -200
./
./test_3.sh <-此文件权限为600
./test_4.sh <-此文件权限为755
./test_1.sh <-此文件权限为200

# "-perm+权限模式":包含任意一个指定权限,就可以找到。
# 因为test_2.sh的权限444-r--r--r--)、test_3.sh 的权限600-rw-------)、test_4.sh 的权限755-rwxr-xr-x)都含有444-r--r--r--)权限,所以可以找到;而test_1.sh 的权限是200--w-------),所以找不到。

[wqf@b1i10 test]$ find ./ -perm /+444
./
./test_3.sh <-此文件权限为600
./test_4.sh <-此文件权限为755
./test_2.sh <-此文件权限为444

六、按所有者和所属组搜索

find 搜索路径 【选项】 搜索内容

选项:

  • -uid 用户 ID:按照用户 ID 査找所有者是指定 ID 的文件
  • -gid 组 ID:按照用户组 ID 査找所属组是指定 ID 的文件
  • -user 用户名:按照用户名査找所有者是指定用户的文件
  • -group 组名:按照组名査找所属组是指定用户组的文件
    -nouser:査找没有所有者的文件

七、逻辑运算符

find 搜索路径 【选项】 搜索内容

选项:

  • -a:and逻辑与
  • -o:or逻辑或
  • -not:not逻辑非

举例说明:

1)-a:and逻辑与
find 命令也支持逻辑运算符选项,其中 -a 代表逻辑与运算,也就是 -a 的两个条件都成立,find 搜索的结果才成立。

#在当前目录下搜索等于1115KB,并且文件类型是普通文件的文件
[wqf@b1i10 rm_test]$ find ./ -size 1115k -a -type f
./mon_tj_cal.txt

2) -o:or逻辑或
-o 选项代表逻辑或运算,也就是 -o 的两个条件只要其中一个成立,find 命令就可以找到结果。

#在当前目录下搜索文件名要么是cals的文件,要么是test_3.sh的文件
[wqf@b1i10 rm_test]$ find ./ -name cals -o -name test_3.sh
./test_3.sh
./test/test_3.sh

3) -not:not逻辑非
-not是逻辑非,也就是取反的意思。

#在当前目录下搜索文件名不是test_3.sh的文件
[wqf@b1i10 test]$ find ./ -not -name  test_3.sh
./
./test_4.sh
./test_1.sh
./test_2.sh

八、其他选项

1)-exec选项

find 搜索路径 【选项】 搜索内容 -exec 命令2 {} \;

注意: 这里的"{}“和”\;“是标准格式,只要执行”-exec"选项,这两个符号必须完整输入,并且{} 与 \之间有空格。这个选项的作用其实是把 find 命令的结果交给由"-exec"调用的命令 2 来处理。"{}"就代表 find 命令的査找结果, \ 做转义,; 结束符。

举例说明:

# 查找当前开始30天之前的并且文件名以".log"结尾的文件并删除
# 使用"-exec"选项,把find命令结果直接交给"rm -rf"命令处理。
find ./ -type f -name "*.log" -mtime +30 -maxdepth 1 -exec rm -rf {} \;

2)-ok选项

find 搜索路径 【选项】 搜索内容 -ok 命令2 {} \;

与"-exec"选项的作用基本一致,区别在于:“-exec"的命令会直接处理,而不询问;”-ok"的命令 2 在处理前会先询问用户是否这样处理,在得到确认命令后,才会执行。

举例说明:

# 使用rm命令来删除find找到的结果,删除的动作最好确认一下
[wqf@b1i10 test]$ find ./ -perm 444 -ok rm -rf {} \;
< rm ... ./test_2.sh > ? y # 需要用户输入y,才会执行

3)-print选项:将find命令匹配的文件输出到标准输出

find 搜索路径 【选项】 搜索内容 -print ;

举例说明:

# 查找当前文件夹下文件名以".log"结尾的文件并输出到屏幕
[wqf@b1i10 rm_test]$ find ./ -name "*.log" -print
./data_val_520_13138333854_2022122200.log
./data_val_520_20221221_2022122117.log
./mon_tj_cal_1_2022120515.log
./mon_tj_cal_1_2022120510.log

有关【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-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  10. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

随机推荐