linux命令系列-find命令

强大实用的命令

具体没有什么记录的,主要是实例的记录,基本的掌握,更多的实例还是绕回到正则上

当然更多的利用还在平常的收集,懒的再搜,特此记录

一.命令详解:

参考:https://www.cnblogs.com/tongyan2/p/5517085.html

其中主要是-print -exec -ok的使用



Linux命令之find的用法

find顾名思义就是查找
,Linux下find命令提供相当多的查找条件,因此功能比较强大,可以在众多文件或目录下查找你想要的任何文件或目录。

find 命令格式:find pathname -options [-print -exec -ok...]

pathname表示find命令所查找的文件或目录的路径。例如:/home/tools/tongyan

-print
: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

find常用命令格式

-name filename #查找名为filename的文件
-perm #按执行权限来查找
-user username #按文件属主来查找
-group groupname #按组来查找
-mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n +n #按文件访问时间来查GIN: 0px">

-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1 !f2 # 找文件,-n指n天以内,+n指n天以前
-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1 !f2 #查更改时间比f1新但比f2旧的文件
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #查长度为n块[或n字节]的文件
-depth #使查找在进入子目录前先行查找完本目录
-fstype #查更改时间比f1新但比f2旧的文件
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #查长度为n块[或n字节]的文件
-depth #使查找在进入子目录前先行查找完本目录
-fstype #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio #对匹配的文件使用cpio命令,将他们备份到磁带设备中
-prune #忽略某个目录

下面具体说明
查找方式有很多种
,比如按文件类型(-type),文件名(-name),文件属主(-user),文件所属组)(-group),文件权限(-perm),文件长度(-size),文件修改时间(-mtime)等查找
文件类型包括:d 目录文件。
l 符号链接(指向另一个文件,类似于瘟下的快捷方式) 。
s 套接字文件。
b 块设备文件,二进制文件
c 字符设备文件
p 命名管道文件
- 普通文件,或更准确地说,不属于以上几种类型的文件
文件权限包括:r 读文件
w 写文件
x 执行文件操作

二.实例记录:

大同小异 随便找两个吧

参考:

https://hae.iteye.com/blog/2092453
https://zhuanlan.zhihu.com/p/36643187

1. 列出当前目录及子目录下所有文件和文件夹

find .

2. 在/admin目录下查找以.txt结尾的文件名

find /admin -iname "*.txt"

3. 找出/ admin下不是以.txt结尾的文件

find / admin ! -name "*.txt"

4. 当前目录及子目录下查找所有以.txt和.pdf结尾的文件

find . -name "*.txt" -o -name "*.pdf"

5. 匹配文件路径或者文件

find /admin/ -path "*user*"

6. 基于正则表达式匹配文件路径

find . -regex ".*\(\.txt\|\.pdf\)$"

7. 搜索出深度距离当前目录至少3个子目录的所有文件

find . -mindepth 3 -type f

8.搜索最近五天内被访问过的所有文件

find . -type f -atime -5

9.搜索五天前被访问过的所有文件

find . -type f -atime 5

10.搜索超过五天被访问过的所有文件

find . -type f -atime +5

11. 搜索访问时间超过5分钟的所有文件

find . -type f -amin +10

12. 删除当前目录下所有.txt文件

find . -type f -name "*.txt" -delete

13. 搜索出当前目录下权限为777的文件

find . -type f -perm 777

14. 找出当前目录下权限不是777的php文件

find . -type f -name "*.php" ! -perm 777

find
实例

  

在 / usr / linux中查找所有的 *.h,并在这些文件中查找“SYSCALL_VECTOR
",最后打印出所有包含"
SYSCALL_VECTOR
"的文件名,有以下几种方法实现

find / usr / linux - name
"*.h" | xargs - n50
grep
SYSCALL_VECTOR

grep
SYSCALL_VECTOR / usr / linux / *.h | cut - d’:’ -f1 | uniq > filename

find / usr / linux - name
"*.h" - exec
grep
"SYSCALL_VECTOR"
{} \; -print

使用find / -name
filename | rm - rf,不成功,请问为什么不成功?

find / -name
filename - exec
rm - rf
{} \;

find. - name
filename | rm - rf试一下
{}
表示你找出来的结果。

\; 则相当于“宪法”,没什么说头,就是这么规定的,在 - exec
后面需要一个表示该命令终结的的符号。可以在
man
find
中找到答案。



要让rm识别find的结果,如下:

find / -name
filename | xargs
rm - rf

之所以find. - name
filename | rm - rf不通过,是因为rm命令不接受从标准输入传过来的指令

查找含特定字符串的文件

例如查找当前目录下含有
"the string you want find…"
字符串的文件:

$find. - type
f - exec
grep “the
string
you
want
find…” {};
-print

从根目录开始查tmpfile,一旦查到马上删除

find / -name
"tmpfile" - exec
rm
{} \;



find
的perm问题

find - name
".*" - perm - 007
的命令数字前的 - 含义

find
path - name
".*" - perm
755

这个是用来查找权限位为755的隐藏文件

find默认是查找当前工作目录的吗?



如果用 - ok
替代 - exec, 那么还需要加上
{} \; 吗?

仍然需要,因为 - ok
只是 - exec
的提示模式,它只是多了一个确认操作的步骤,

-007
是指查找所有用户都可读、写、执行的文件

find - name
".*" - perm - 007

find - name
".*" - perm
777
有区别吗?

-007
是怎么来得呢?

不过有一个问题

我用
find. - perm - 100
会列出当前目录., 这是为什么呢?



下面引用由explover在
2002 / 10 / 01
06:15
am
发表的内容:

-007
是指查找所有用户都可读、写、执行的文件,要小心呀
~~~

-007
是查找含其它用户(不同组, 非属主)
可读, 写, 执行的文件.并不一定要同组可读写, -是指最少权限为007.

下面引用由一颗小白菜在
2002 / 10 / 01
10:16
am
发表的内容:



我用
find. - perm - 100
会列出当前目录., 这是为什么呢?

这种方法不会准确的找出目录的. - 100
是指权限至少是属主可运行.

在unix系统下, 你可以拥有对目录文件的执行权你才可以进入一个目录.这便是目录文件被列出的原因.

find. - perm - 001 - print找到往往是目录文件.

-010
是指权限至少是owner同组可执行的, 也就是说其实这里的010和 - 是分开的,-表示一个至少的意思,而且010才是真正用来描述权限位的

将find出来的东西拷到另一个地方

find *.c - exec
cp ‘{}’ / tmp ‘;’

如果有特殊文件,可以用cpio,也可以用这样的语法:

find
dir - name
filename - print | cpio - pdv
newdir

找出磁盘中某个大小范围内的文件

比如要查找磁盘中大于3M的文件:

find. - size + 3000
k - exec
ls - ld
{};

如何用find查找某一天更改的文件?

可以使用这一行命令来实现:

A = `find
~ -print
` | ls - l –full - time $A
2 > / dev / null | grep
"Jun 27" | grep
1998

使用find
命令查找某个时间段。比如11点到12点的

创建一个脚本judgetime,内容如下:

ls - l $ * | awk ‘{split($8, hour, ":");if ((hour[1] > 23 | | hour[1] < 1) & & hour[1] < 24)print}’

到要查找的目录下,运行

find. / -name
"*" - exec
judgetime
{} \;

注意时间格式为24小时制。



如果要精确到分钟

touch - t
04241112
starttemp # 精确到12分钟

touch - t
04241220
endtemp # 截止到12点20

find[dir] - newer
starttemp - a ! -newer
endtemp - exec
ls - l
{} \;



删除指定日期的文件

find. / -name
文件名 - exec
rm - f
{} \;



例:删除当前30天内没用过的文件, 用如下命令:

find / -atime + 30 - exec
rm - f
{} \;





删除多少天之前的文件

find / yourpath - mtime + 31 - exec
rm
{} \;

find / yourpath - mtime + 366 - exec
rm
{} \;





至于文件备份, 有什么不可以的么?

mtime
ls - l
最近修改文件内容的时间

atime
ls - lu
最近访问文件的时间

ctime
ls - li
最近文件有所改变的状态, 如文件修改, 属性\属主
改变, 节点, 链接变化等, 应该是不拘泥只是时间前后的改变

俺看了ls的帮助, 以为只是按ctime或atime排序, 显示的时间还是mtime.

2019.5.7

发表评论

电子邮件地址不会被公开。 必填项已用*标注