请问linux下如何递归查找某个目录的所有文件

请问linux下如何递归查找某个目录的所有文件,第1张

用find。

比如,我在根目录"/"下查找一个名字为”a.c“的文件

find

/

-type

f

-name

"a.c"

-type

f

---说明我查找的是一个常规文件。

find 命令的基本结构如下:

find [paths] [expression] [actions]

find 命令接受一个或多个 路径 ( paths )作为搜索范围,并在该路径下 递归 地搜索。即检索完指定的目录后,还会对该目录下的子目录进行检索,以及子目录下的子目录。。。直到到达目录树底部。

默认情况下(不带任何搜索条件),find 命令会返回指定目录下的 所有文件 ,所以常常需要通过特定的 expression 对结果进行 筛选

find 命令默认的 action 是将所有检索结果打印至标准输出。可以通过自定义 action ,让 find 命令对搜索到的结果执行特定的 *** 作。

这里先不做详细解释,简单地测试下 find 命令:

find 命令中的 -name 选项可以根据文件名称进行检索( 区分大小写 )。如需要忽略文件名中的大小写,可以使用 -iname 选项。

-name 和 -iname 两个选项都支持 wildcards 。如:

find /usr -name '*.txt' 查找 /usr 目录下所有文件名以 .txt 结尾的文件

find /usr -name '????' 查找 /usr 目录下所有文件名刚好为 4 个字符的文件

有些时候,你需要在搜索时匹配某个文件或目录的 完整路径 ,而不仅仅是匹配文件名。可以使用 -path 或 -ipath 选项。

如查找 /usr 下所有文件名以 .txt 结尾的文件或目录,且该文件的父目录必须是 src 。可以使用以下命令:

find /usr -path '*/src/*.txt'

如果只想搜索得到文件 目录,即不想它们同时出现在结果中。可以使用 -type 选项指定文件类型。

-type 选项最常用的参数如下:

find /usr -type d -name 'python*' 检索 /usr 下所有文件名以 python 开头的 目录

find 命令支持 -empty 选项用来检索 为空 的文件或目录。空文件即文件里没有任何内容,空目录即目录中没有任何文件或子目录。

find ~ -type d -empty 检索用户主目录下所有的空目录

find 命令也允许用户对当前的匹配条件进行 “反义” (类似于 逻辑非 *** 作)。

如需要检索 /usr 下所有文件名 以 .txt 为后缀的文件。可以使用以下命令:

find /usr -type f ! -name '*.txt'

也可以“翻转”任何其他的筛选条件,如:

find /usr -type f ! -empty 检索 /usr 下所有内容不为空的文件

为了检索归属于特定用户的文件或目录,可以使用 -user 选项。

find / -type f -user starky 检索根目录下所有属主为 starky 的文件

类似于 -user 选项, -group 选项则可以根据文件或目录的 属组 进行检索。

有些时候,需要根据文件创建或修改的时间进行检索。

Linux 系统中,与文件相关联的时间参数有以下三种:

与此对应的是 find 命令中的 -mtime , -atime 和 -ctime 三个选项。

这三个选项的使用遵循以下示例中的规则:

find /usr -type f -mtime 2 检索 /usr 下两天前被修改过的文件

如果觉得 -mtime 等选项以 为单位时间有点长,还可以使用 -mmin , -amin , -cmin 三个选项:

find /usr -type f -mtime +50 -mtime -100 检索 /usr 下 50 到 100 天之前修改过的文件

find /usr -type f -mtime 2 -amin 5 检索 /usr 下两天前被修改过且 5 分钟前又读取过的文件

-size 选项允许用户通过文件大小进行搜索(只适用于文件,目录没有大小……)。

表示文件大小的单位由以下字符组成:

另外,还可以使用 + 或 - 符号表示 大于 小于 当前条件。

find / -size +1G 检索文件大小高于 1 GB 的文件

find 命令可以使用 -perm 选项以文件权限为依据进行搜索。

如需要检索 /usr 目录下权限为 rwxr-xr-x 的文件,可以使用以下命令:

find /usr -perm u=rwx,g=rx,o=rx

搜索 /usr 目录下所有权限为 r-xr-xr-x (即系统中的所有用户都只有读写权限)的文件和目录,可以使用以下命令:

find /usr -perm a=rx

很多时候,我们只想匹配文件权限的一个 子集 。比如,检索可以直接被任何用户执行的文件,即只关心文件的执行权限,而不用管其读写权限是什么。

上述的需求可以通过以下命令实现: find / -type f -perm /a=x

其中 a=x 前面的 / 符号即用来表示只匹配权限的某个子集(执行权限),而不用关心其他权限的具体设置。

-perm 选项也支持数字形式的文件权限标记。

find /usr -perm 644 搜索 /usr 目录下权限为 644 (即 rwxr-xr-x )的文件

find 命令默认是以 递归 的方式检索项目的,这有时候会导致得到的结果数量非常巨大。可以使用 -maxdepth 限制 find 命令递归的层数。

find / -maxdepth 3 搜索时向下递归的层数最大为 3

在之前的例子中有出现多个搜索条件的 组合 以及对某个搜索条件的 反转

实际上 find 命令支持 “and” “or” 两种逻辑运算,对应的命令选项分别是 -a 和 -o 。通过这两个选项可以对搜索条件进行更复杂的组合。

此外还可以使用 小括号 对搜索条件进行 分组 。注意 find 命令中的小括号常需要用 单引号 包裹起来。因小括号在 Shell 中有特殊的含义。

如检索 /usr 下文件名以 python 开头且类型为目录的文件

find /usr -type d -name 'python*'

该命令等同于:

find /usr -type d -a -name 'python*'

更复杂的组合形式如:

find / '(' -mmin -5 -o -mtime +50 ')' -a -type f

-delete 选项可以用来删除搜索到的文件和目录。

如删除 home 目录下所有的空目录:

find ~ -type d -empty -delete

-exec 选项可以对搜索到的结果执行特定的命令。

如需要将 home 目录下所有的 MP3 音频文件复制到移动存储设备(假设路径是 /media/MyDrive ),可使用下面的命令:

find ~ -type f -name '*.mp3' -exec cp {} /media/MyDrive ''

其中的 大括号 ( {} )作为检索到的文件的 占位符 ,而分号( )作为命令结束的标志。因为分号是 Shell 中有特殊含义的符号,所以需要使用单引号括起来。

每当 find 命令检索到一个符合条件的文件,会使用其完整路径取代命令中的 {} ,然后执行 -exec 后面的命令一次。

另一个很重要的用法是,在多个文件中检索某个指定的字符串。

如在用户主目录下的所有文件中检索字符串 hello ,可以使用如下命令:

find ~ -type f -exec grep -l hello {} ''

创建 Gzip 格式的压缩文件的命令为: tar -czvf filename.tar.gz <list of files>

现在假设需要将用户主目录下所有的 MP3 文件添加到压缩包 music.tar.gz 中,直观的感觉是,其命令应为如下形式:

find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} ''

实际情况是,这样得到的 music.tar.gz 其实只包含一个 MP3 文件。

原因是 find 命令 每次 发现一个音频文件,都会再执行一次 -exec 选项后面的压缩命令。导致先前生成的压缩包被覆盖。

可以先让 find 命令检索出所有符合条件的音频文件,再将得到的 文件列表 传递给后面的压缩命令。完整的命令如下:

find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} +

如果想浏览搜索到的文件(目录)的详细信息(如权限和大小等),可以直接使用 -ls 选项。

find / -type file -size +1G -ls 浏览所有 1G 以上大小的文件的详细信息

A Guide to the Linux “Find” Command

find 命令手册 : man find

从文件中搜索并显示文件名

当你从不止一个的文件中搜索时,默认它将显示文件名:

代码如下:

grep

"word"

文件名

grep

root

/etc/*

示例输出:

代码如下:

/etc/bash.bashrc:

See

"man

sudo_root"

for

details.

/etc/crontab:17

*

*

*

*

root

cd

/

&&

run-parts

--report

/etc/cron.hourly

/etc/crontab:25

6

*

*

*

root

test

-x

/usr/sbin/anacron

||

(

cd

/

&&

run-parts

--report

/etc/cron.daily

)

/etc/crontab:47

6

*

*

7

root

test

-x

/usr/sbin/anacron

||

(

cd

/

&&

run-parts

--report

/etc/cron.weekly

)

/etc/crontab:52

6

1

*

*

root

test

-x

/usr/sbin/anacron

||

(

cd

/

&&

run-parts

--report

/etc/cron.monthly

)

/etc/group:root:x:0:

grep:

/etc/gshadow:

Permission

denied

/etc/logrotate.conf:

create

0664

root

utmp

/etc/logrotate.conf:

create

0660

root

utmp

每行开始的第一个部分是文件名(如:/etc/crontab、/etc/group)。使用

-l

选项可以只显示文件名:

代码如下:

grep

-l

"string"

filename

grep

-l

root

/etc/*

示例输出:

代码如下:

/etc/aliases

/etc/arpwatch.conf

grep:

/etc/at.deny:

Permission

denied

/etc/bash.bashrc

/etc/bash_completion

/etc/ca-certificates.conf

/etc/crontab

/etc/group

你也可以逆转输出使用

-L

选项来输出那些不匹配的文件的文件名:

代码如下:

grep

-L

"word"

filename

grep

-L

root

/etc/*

示例输出:

代码如下:

/etc/apm

/etc/apparmor

/etc/apparmor.d

/etc/apport

/etc/apt

/etc/avahi

/etc/bash_completion.d

/etc/bindresvport.blacklist

/etc/blkid.conf

/etc/bluetooth

/etc/bogofilter.cf

/etc/bonobo-activation

/etc/brlapi.key

根据文件内容查找文件

输入以下命令:

代码如下:

grep

'string'

*.txt

grep

'main('

*.c

grep

'#include'

*.c

grep

'getChar*'

*.c

grep

-i

'ultra'

*.conf

grep

-iR

'ultra'

*.conf

其中

-i

忽略模式(匹配字符串

valid、

VALID、

ValID

)和输入文件(匹配

file.c

FILE.c

FILE.C)的大小写。

-R

递归读取每个目录下的所有文件。

高亮匹配到的模式

在搜索大量文件的时候你可以轻松地高亮模式:

代码如下:

$

grep

--color=auto

-iR

'getChar()'

*.c

为查找到的模式显示文件名和行号

你也许需要显示文件名和行号:

代码如下:

$

grep

--color=auto

-iRnH

'getChar()'

*.c

其中,

-n

在输出的每行前面添加以

1

开始的行号。

-H

为每个匹配打印文件名。要搜索多个文件时这是默认选项。(LCTT

译注:-h

选项强制隐藏文件名另外

-l

-L

选项用于仅显示匹配/不匹配的文件名,而

-H

-h用于控制在显示匹配行前显示/不显示文件名,注意区分。)

代码如下:

$grep

--color=auto

-nH

'DIR'

*

输出样例:

你也可以使用

find

命令:

代码如下:

$

find

.

-name

"*.c"

-print

|

xargs

grep

"main("


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8973966.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-23
下一篇 2023-04-23

发表评论

登录后才能评论

评论列表(0条)

保存