2.4文件查找与文件列表

find是unix/linux命令行工具箱中最棒的工具之一。

1、find命令的工作方式如下:沿着文件层次结构向下遍历,匹配符合条件的文件,执行相应的操作。

2、要列出当前目录及子目录下所有的文件和文件夹:

$find base_path

base_path可以放在任意位置,find会从该位置开始向下查找。如

$find . -print

#打印文件和目录的列表

-print指明打印出匹配文件的文件名(路径)。当使用-print时,‘\n‘作为用于对输出的文件名进行分隔。就算忽略-print,find命令仍会打印出文件名。

-print0指明使用‘\0‘作为匹配的文件名之间的定界符,当文件名中包含换行符这个方法就有用了。

3、补充内容

a、根据文件名或正则表达式进行搜索

选项-name的参数指定了文件名所必须匹配的字符串。可以将通配符作为参数使用。*.txt能够匹配所有以.txt结尾的文件名。选项-print在终端中打印出符合条件(如-name)的文件名或文件路径。如

$find /home/slynux -name "*.txt" -print

find命令有一个选项-iname(忽略字符大小写)。

如果想匹配多个条件中的一个,则可以采用OR条件操作:

$ls

new.txt some.jpg text.pdf

$find . \(-name "*.txt" -o - name "*.pdf" \) -print

./text.pdf

./new.txt

上面的代码会打印出所有的.txt和.pdf文件,是因为这个find命令能够匹配所有这两类文件。\(以及\)用于将-name "*.txt" -o -name "*.pdf"视为一个整体。

选项-path的参数可以使用通配符来匹配文件路径。-name总是用给定的文件名进行匹配。-path则将文件路径作为一个整体进行匹配。如

$find /home/users -path "*/slynux/*" -print

这会匹配以下路径:

/home/users/list/slynux.txt

/home/users/slynux/eg.css

选项-regex的参数和-path的类似,只不过-regex是基于正则表达式来匹配文件路径的。

正则表达式是通配符匹配的最高级形式,它可以指定文本模式。我们借助这种模式来匹配文本及进行打印。使用正则表达式进行文本匹配的一个典型例子就是从一堆文本中解析所有的E-mail地址。E-mail地址通常采用[email protected]这种形式,所以可以将其一般化为[a-z0-9][email protected][a-z0-9]+.[a-z0-9]+。符号+指明在它之前的字符类中的字符可以出现一次或多次。

下面的命令匹配.py或.sh文件

$ls

new.py next.jpg test.py

$find .  -regex ".*\(\.py\|\.sh\)$"

类似的,-iregex可以让正则表达式忽略大小写。

b、否定参数

find也可以用“!”否定参数的含义。如

$find . ! -name "*.txt" -print

上面的命令能够匹配所有不以.txt结尾的文件名。

c、基于目录深度的搜索

find命令在使用时会遍历所有的子目录。可以采用深度选项-maxdepth和-mindepth来限制find命令遍历的目录深度。

当使用find在当前目录中查找,使用深度设置为1;向下两级时,使用深度可以设置为2,以此类推。

注意:-maxdepth和-mindepth应该作为find的第三个参数出现。

d、根据文件类型搜索

文件具有不同的类型,如普通文件(f)、目录(d)、字符设备(c)、块设备(d)、符号链接(l)、硬链接、套接字(s)以及FIFO(p)等。

-type可以对文件搜索进行过滤。如

$find . -type d -print #只列出所有目录

$find . -type f -print #只列出所有文件

$find .-type l -print #只列出符号链接

e、根据文件时间进行搜索

unix/linux文件系统中的每一个文件都有三种时间戳,如下

访问时间(-atime):用户最近一次访问文件的时间

修改时间(-mtime):文件内容最后一次被修改的时间。

变化时间(-ctime):文件元数据(例如权限或所有权)最后一次改变的时间。

在unix中并没有所谓的“创建时间”的概念。

-atime,-mtime,-ctime可作为find的时间选项。他们可以用整数值指定,单位是天。这些整数值通常还带有-或+:-表示小于,+表示大于。

如:打印出在最近7天内被访问过的所有文件:

$find . -type f -atime -7 -print

打印出恰好在7天前被访问过的所有文件

$find . -type f -atime 7 -print

同理,超过的时候就使用+7.

还有一些基于时间的参数,但其单位是分钟。

-amin(访问时间)

-mmin(修改时间)

-cmin(变化时间)

eg:$ find . -type f -amin +7 -print#打印出访问时间超过7分钟的所有文件。

使用-newer,可以指定一个用于比较时间戳的参考文件,然后找出比参考文件更新的(更近的修改时间)所有文件。

如:找出比file.txt修改时间更近的所有文件

$find . -type f -newer file.txt -print

这个选项对编写系统备份和维护脚本很有帮助。

f、基于文件大小的搜索

$find . -type f -size +2k #大于2KB的文件

$finid . -type f -size -2k #小于2KB的文件

$finid . -type f -size 2k #等于2KB的文件

·除了k之外还有,b(块:512字节),c(字节),w(字:2字节),k(1024字节),M(1024k字节),G(1024M字节)。

g、删除匹配的文件

-delete可以用来删除find查找到的匹配文件

$find . -type f -name "*.swp" -delete

h、基于文件权限和所有权的匹配

列出具有特定权限的所有文件:

$find . -type f -perm 644 -print#打印出权限为644的文件

-perm指明find应该只匹配具有特定权限值的文件。

如:找到那些没有设置好执行权限的PHP文件:

$ find . -type f -name "*.php ! -perm 644 -print"

也可以根据文件的所有权进行搜索。用选项-user USER就能够找出由某个特定用户所拥有的文件。

参数USER可以是用户名或UID。

例如,打印出用户slynux拥有的所有文件

$ find . -type f -user slynux -print

i、利用find执行命令或动作

find命令可以借助选项-exec与其他命令进行结合。-exec算得上是find最强大的特性之一。

注意:必须以root用户的身份执行命令才能够进行所有权的更改。

#find . -type f -user root -exec chown slynux {} \;#将root用户的文件所有权更改成另一位用户

在这个命令中,{}是一个与exec选项搭配使用的特殊字符串。对于每一个匹配的文件,{}会被替换成相应的文件名。如:find命令找到两个文件test1.txt和test2.txt,其所有者均为slynux,那么find就会执行;

chown slynux{}

它会被解析为chown slynux test1.txt和chown slynux test2.txt

有时候我们并不希望对每个文件都执行一次命令。我们更希望使用文件列表作为命令参数,这样就可以少运行几次命令了。如果是这样,可以在exec中使用+来代替。

将给定目录中的所有c程序文件拼接起来写入单个文件all_c_files.txt,可以使用find找到所有的c文件,然后结合-exec使用cat命令

$find . -type f -name "*.c" -exec cat {} \; >all_c_files.txt

-exec之后可以接任何命令。{}表示一个匹配。对于任何匹配的文件名,{}均会被该文件名所替换。上面使用>作为重定向操作符,而>>表示重定向追加的意思。当有多个数据流被追加到单个文件中时才有必要使用>>。

$find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;#将10天前的.txt文件复制到OLD目录中。

注意:-exec结合多个命令,我们无法再-exec参数中直接使用多个命令。它只能够接受单个命令,不过可以把多个命令写到一个shell脚本,然后在-exec中使用这个脚本:-exec ./commands.sh {} \;

-exec能够同printf结合来生成有用的输出信息,eg

$find . -type f -name "*.txt" -exec printf "Text file :%s\n" {} \;

j.让findt跳过特定的目录

将某些文件或目录从搜索过程中排除在外的技巧被称为修剪。

$find devel/source_path \(-name ".git" -prune\) -o \(-type f -printf \)

以上命令打印出不包括在.git目录中的所有文件的名称(路径)。

\(-name ".git" -prune \)的作用是用于进行排除,它指明了.git目录应该被排除在外,而\(-type f -printf \)指明了需要执行的动作。

时间: 2024-08-12 14:13:22

2.4文件查找与文件列表的相关文章

6.文件查找与文件列表---FIND

find命令的工作方式如下: 沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作. 1.要列出当前目录及子目录下所有的文件和文件夹,可以采用下面的写法: find base_path, base_path 可以是任何位置. find . -print     打印文件和目录的列表. -print指明打印出匹配文件的文件名(路径). 当使用-print时,'\n'用作分隔文件的定界符.  -print0 指明使用'\0'作为定界符来打印每一个匹配的的文件名.当文件名中包含换行符时,这个

脚本基础,文件查找,文件打包压缩。

本周知识点: ''' 1.文本处理工具和正则表达式 抽取文本的工具: 文件内容:cat,用于查看文件内容的基本命令,-E显示行结束符$ -n 显示行号 -A显示所有控制符-b 非空行编号 -s 压缩连续的空行成一行.hexdump :可以查看文件的ASCII值more :分页查看文件 -d 显示翻页及退出提示less : 一页一页地查看文件. /文本 搜索文本 n/N 跳到下一个或上一个匹配 显示文本前或后行内容 head : -c# 指定获取前#字节 -n# 指定获取前#行 (n可以省略)ta

<实训|第十一天>学习一下linux中的进程,文件查找,文件压缩与IO重定向

[[email protected]~]#序言 在今后的工作中,运维工程师每天的例行事务就是使用free -m,top,uptime,df -h...每天都要检查一下服务器,看看是否出现异常.那么今天我们就讲解一下关于运维工程师例行事务的知识!  开班第十一天: [[email protected]~]#今天的课程大纲 查看进程,中断进程,切换进程 内存与swap分区 linux中文件查找的基本方法 linux中是如何解压缩文件的 关于I/O重定向的知识点 远程scp配合管道 详细讲解: [[e

Linux下文件查找

linux文件查找 find 文件查找 locate 文件查找:在文件系统上查找符合条件的文件 locate 依赖于事先构建好的索引库     查询系统上预建的文件索引数据库     /var/lib/mlocate/mlocate.db 系统自动实现,周期性任务. 手动创建跟新数据库(updatedb,非常消耗系统资源) 慎用! 工作特性:     查找速度快     模糊查找     非实时查找,可能文件已经有变动或不存在     locate [option]...PATTERN...  

linux_find文件查找命令

文件查找: locate,非实时查找,在临时数据库里进行查找,模糊匹配. [[email protected] ~]# locate passwd 查找当前系统里有没有passwd这个文件 updatede 手动生成临时数据库 优势:速度快,占用资源少 find:实时查找,精确查找,遍历指定目录中的所有文件,速度慢.支持众多查找标准.支持正则表达式 格式:find 查找路径查找标准 查找到以后的处理动作 省略查找路径,就默认为当前目录 省略查找标准,默认为指定路径下的所有文件 处理动作:默认为显

20181216文件查找

文件查找 grep: 文件内容过滤find: 文件查找,针对文件名一.命令文件which ls //从 PATH 环境变量 (echo $PATH) [[email protected] ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/htop/bin/:/root/bin二.任意文件(一). locate (查询的数据库: /var/lib/mlocate/mlocate.db)计划任务:每

关于文件查找和解压缩

文件查找和解压缩在文件系统上查找符合条件的文件,文件查找的工具有两个,locate 和 find文件查找分为:            locate      非实时查找 (在数据库查找)             updatedb   更新数据库            经常用于搜索稳定的文件,比如配置文件            var/lib/mlocate/mlocate.db 数据库路径             find     实时查找 locate :       查询系统上预建的文件索引

Linux使用vim进行多文件查找和替换的方法

vim是Linux系统下常用的文本编辑,通过使用多种shell命令能够实现多文件的查找和替换,那么具体会使用到那些命令呢?下面小编就给大家介绍下Linux系统vim多文件查找和替换的方法. 在linux平台上,有很多优秀的shell命令组合来做多文件查找/替换,比如这些命令:find,sed,grep,awk,perl.但其他平台比如windows上就没那么方便了,这时候vim内置的多文件查找命令就有用武之地了,虽然比起外部命令来稍微慢了一点. vim 多文件查找 这个vim内置命令就是vimg

Node.js入门:文件查找机制

文件查找流程图 从文件模块缓存中加载 尽管原生模块与文件模块的优先级不同,但是都不会优先于从文件模块的缓存中加载已经存在的模块. 从原生模块加载 原生模块的优先级仅次于文件模块缓存的优先级.require方法在解析文件名之后,优先检查模块是否在原生模块列表中.以http模块为例,尽管在目录下存在一个http/http.js/http.node/http.json文件,require("http")都不会从这些文件中加载,而是从原生模块中加载. 原生模块也有一个缓存区,同样也是优先从缓存