每日一个Linux 命令-Find

find — Linux manual page

find - 在目录层次结构中搜索文件

find 路径 -命令参数 [输出形式]
参数说明:
路径:告诉find在哪儿去找你要的东西,
命令参数:参数很多下面会说到
输出形式:输出形式很多,-print,-printf,-print0,-exec,-ok,-ls反正很多自己看手册吧
说一下exec,
-exec find命令对匹配的文件执行该参数所给出的其他linux命令。相应命令的形式为' 命令 - and' {} \;,注意{ }和\;之间的空格,\;是结束符,也可以是\+。
-ok 和- exec的作用相同,只不过和会人交互而已,OK执行前会向你确认是不是要执行。
-name 按照文件名查找文件。
-perm 按照文件权限来查找文件。
-prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用了- depth选项,那么-prune选项将被find命令忽略。
-user 按照文件属主来查找文件。
-group 按照文件所属的组来查找文件。
-mtime -n +n 按照文件的更改时间来查找文件, -n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime选项,但它们都和-mtime选项
相似,所以我们在这里只介绍-mtime选项。
-nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。
-type 查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
s - socket文件
-size n[cwbkMG] : 文件大小 为 n 个由后缀决定的数据块。其中后缀为:
b: 代表 512 位元组的区块(如果用户没有指定后缀,则默认为 b)
c: 表示字节数
k: 表示 kilo bytes (1024字节)
w: 字 (2字节)
M:兆字节(1048576字节)
G: 千兆字节 (1073741824字节)
-depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-delete (删除)
-maxdepth 查找最大目录层数 如 1,即只查找一层目录
-fstype 查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件
/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount 在查找文件时不跨越文件系统mount点。
-follow 如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio 对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
-o 是或者的意思
-a 是而且的意思
-not 是相反的意思
参数

下面通过一些简单的例子来介绍下find的常规用法:

将查找(并打印)系统上的每个文件。由于所有内容都是文件,因此您将获得大量输出以进行排序。这可能无法帮助您找到所需的内容。您可以更改path参数以缩小范围,但实际上并没有比使用ls命令有用。

也许您想在主目录中找到所有JPEG文件。使用-name参数可以将结果限制为与给定模式匹配的文件。

#find ~ -name '*jpg' 

如果其中一些扩展名为大写怎么办?-iname类似于-name,但是不区分大小写。

#find ~ -iname '*jpg' 

有些图片可能具有.jpeg扩展名。幸运的是,我们可以将模式与以-o表示的“或”组合。

# find ~ ( -iname 'jpeg' -o -iname 'jpg' )

但是,如果您有一些以jpg结尾的目录怎么办?(为什么您不命名图片而是为目录bucketofjpg命名。)我们可以使用-type参数修改命令以仅查找文件。

# find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f 

或者,也许您想找到那些名字奇怪的目录,以便以后可以重命名它们:

# find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type d 

您最近拍摄了很多照片,所以让我们将其范围缩小到上周已更改的文件。

# find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f -mtime -7 

您可以根据文件状态更改时间(ctime),修改时间(mtime)或访问时间(atime)进行时间过滤。这些以天为单位,因此,如果要进行更细粒度的控制,则可以用分钟来表示(分别为cmin,mmin和amin)。除非确切知道您想要的时间,否则您可能会在数字前加上+(大于)或–(小于)。

# find ./ -name "*" -type f -mtime +7 -delete  #当前下面7天前所以的文件并删除

# find . -mtime -2 -type f -print  #查找2天内被更改过的文件  

# find . -mtime +2 -type f -print   #查找2天前被更改过的文件 

# find . -atime -1 -type f -print  #查找一天内被访问的文件 

# find . -atime +1 -type f -print  #查找一天前被访问的文件 
 
# find . -ctime -1 -type f -print   #查找一天内状态被改变的文件

# find . -ctime +1 -type f -print   #查找一天前状态被改变的文件

# find . -cmin +10 -type f -print #  查找10分钟以前状态被改变的文件 

 

限定日期查找文件
# 寻找 当前目录 修改时间在 2020-01-24 的文件

# find . -type f -newermt 2020-01-24 ! -newermt 2020-01-25 

# 寻找 当前目录 修改时间在 2020-01-24 08:00 ~ 2020-01-25 08:00 的文件

# find . -type f -newermt "2020-01-24 08:00" ! -newermt "2020-01-25 08:00"

 

 

但是也许您不在乎您的照片。也许磁盘空间用完了,所以您想在日志目录中找到所有巨大的文件(让我们将其定义为“大于1 GB”):

注意+号表示大于-号表示小于
# find /var/log -size +1G -print

或者,也许您想在/ data中找到ccn拥有的所有文件:

# find /data -owner ccn

您也可以根据权限查找文件。也许您想在主目录中找到所有世界可读的文件,以确保您不会共享过多文件。

# find ~ -perm -o=r 
# find ~ -perm 755 -print |more   #~代表的是$home目录,查找权限为755的文件
# find . -perm 700 -name "u_*" -print |more  #查找所有以产u_开头的,并且权限为700的文件
# find . -perm /222    #搜索某人(其所有者或他们的小组或其他任何人)
# find . -perm /220
# find . -perm /u+w,g+w
# find . -perm /u=w,g=w       ##这三个命令都执行相同的操作,但是第一个使用文件模式的八进制表示形式,另外两个使用符号形式。这些命令都将搜索以下文件可由其所有者或他们的组写。文件没有所有人和团体均可写成相符;要么会做。
# find . -perm -220
# find . -perm -g+w,u+w
#这两个命令都做同样的事情。搜索以下文件他们的主人和他们的小组都可以写
#   find . -perm -444 -perm /222 \! -perm /111
#   find . -perm -a+r -perm /a+w \! -perm /a+x
#这两个命令都搜索可读的文件每个人(-perm -444或-perm -a + r),至少有一个写位设置(-perm / 222或-perm / a + w),但任何人都不可执行(!-perm/ 111和!-perm / a + x)。
prune来忽略目录来查找
# find . -name "*.gz"  -prune -o \( \! -name aaa \)  -print  #查找在前目录中,不在以aaa结尾的目录中的,不以gz结尾的文件
#       cd /source-dir
#       find . -name .snapshot -prune -o \( \! -name '*~' -print0 \)|cpio -pmd0 /dest-dir

#此命令将/ source-dir的内容复制到/ dest-dir,但是省略名为.snapshot的文件和目录(以及其中的任何内容)。它还会省略名称以〜结尾的文件或目录,但不会他们的内容。-prune -o \(... -print0 \)的构造相当共同。这里的想法是-prune之前的表达式匹配要修剪的东西。
但是,-prune操作本身返回true,因此以下-o确保右侧为仅针对未修剪的目录评估(修剪目录的内容甚至都不会被访问,因此它们的内容内容无关)。右侧的表达-o放在括号中只是为了清楚起见。它强调-print0操作仅对没有-prune的事物发生适用于他们。
因为两次测试之间的默认“和”条件绑定比-o更紧密,无论如何这是默认设置,但是括号有助于显示发生了什么。
通过名字来查找
# find ~ -name memcached.pid -print   #查找home目录下文件名为memcache.pid的文件
# find . -name "*.pid" -print      #.代表当前目录,查找所有以pid结尾的文件
# find ~ -name "[0-9]*.pid" -print   #查找以数字开头的所有pid文件,在这里要说[0-9]*不能匹配23,它跟一般的语言类正则不太一样,shell里面的*可以代表一切字符(单个,多个都行),如果想匹配2345只能这样写[0-9][0-9][0-9][0-9]
根据文件类型来查找文件
# find . -type d -print   #查找当前目录下面的目录
# find . ! -type d -print  #找当前目录下面的非目录文件
# find /tmp -type f,d,l   #搜索目录中的文件,目录和符号链接/ tmp将这些类型作为逗号分隔的列表(GNU扩展)传递,在其他方面,这等效于更长,但更便于移植
# find /tmp \( -type f -o -type d -o -type l \) #搜索具有特定名称的文件,并在我们找到第一个
根据文件所属用户和用户组来找文件
# find . -nouser -print  #查找当前目录中,没有归属的文件
# find . -user ccn -group users -print  #查找用户组为users,所属用户为ccn的文件
exec执行命令
# find . -type f -size +1000000c -exec ls -al {} \;  #显示当前目录下面所有大于1000000的文件,exec后面执行了一个命令,{}这个代表文件名
# find ./ -name "null_*" -exec basename {} \; | sort   #搜索文件,并只显示文件名,以升序排列。
# find . -name 'del.txt' -ok rm {} \;   #查找 del.txt 并删除,删除前提示确认 
# find . -name 'aa.txt' -exec cp {} {}.bak \;  #查找 aa.txt 并备份为aa.txt.bak
# find . -type f -exec ls -l {} \;   #查当前目录下的所有普通文件
# find logs -type f -mtime +5 -exec   -ok   rm {} \; #在 /logs 目录中查找更改时间在5日以前的文件并删除它们
# find   ./   -mtime   -1   -type f   -exec   ls -l   {} \; #查询当天修改过的文件

查找目录并列出目录下的文件(为找到的每一个目录单独执行ls命令,没有选项-print时文件列表前一行不会显示目录名称)
# find /home -type d -print -exec ls {} \;

Find -exec与Find   |xargs

如果要按模式搜索文件,然后将某些内容应用于结果,则至少有两个选择。您可以使用查找。-exec或将结果通过管道传递给xargs。find -exec和find |还有两种不同的选择。会对性能产生巨大影响的xargs。那么有什么区别,应该选择哪一个呢?

我们从一个非常基本的例子开始

1、在文件中搜索

仅搜索以.php结尾的文件,并在这些文件中查找字符串$ test:

# find -exec \;
find . -name \*.php -type f -exec grep -Hn '$test' {} \;

# find -exec \+
find . -name \*.php -type f -exec grep -Hn '$test' {} \+

# find | xargs -n1
find . -name \*.php -type f -print0 | xargs -0 -n1 grep -Hn '$test'

# find | xargs
find . -name \*.php -type f -print0 | xargs -0 grep -Hn '$test'

他们似乎都一样。让我们看看他们是否都找到相同数量的结果:

# Getting directory size
# '| wc -l' will print the number of lines found instead of the results

# time find -exec \;
find . -name \*.php -type f -exec grep -Hn '$test' {} \; | wc -l
   2213

# find -exec \+
find . -name \*.php -type f -exec grep -Hn '$test' {} \+ | wc -l
   2213

# find | xargs -n1
find . -name \*.php -type f -print0 | xargs -0 -n1 grep -Hn '$test' | wc -l
   2213

# find | xargs
find . -name \*.php -type f -print0 | xargs -0 -grep -Hn '$test' | wc -l
   2213

两者也没什么不同,让我们详细了解一下命令

1.1 What is equal in find -exec

find .
# find all files, folders, symlinks, etc in the current directory recursively

find . -name \*.php
# find all files, folders, symlinks, etc in the current directory recursively
# Its filename must end with .php

find . -name \*.php -type f
# find all files, folders, symlinks, etc in the current directory recursively
# Its filename must end with .php
# Only search for files (not folders)

find . -name \*.php -type f -exec [cmd]
# find all files, folders, symlinks, etc in the current directory recursively
# Its filename must end with .php
# Only search for files (not folders)
# Execute a command on the results

对于所有三个查询,以上内容均相同。让我们看一下grep命令

grep -H
# -H  Always print filename headers with output lines.

grep -Hn
# -H  Always print filename headers with output lines.
# -n  Each output line is preceded by its relative line number in the file, starting at line 1. 

1.2 What is different in find -exec

1.2.1 find \;

find . [args] -exec [cmd] {} \;   {}是find找到的结果的占位符,\;是对于每个找到的结果,命令(在本例中为“ grep”)与找到的结果一起执行一次

1.2.2 find +

# find . [args] -exec [cmd] {} \+     \+ 将所有结果行连接起来,并且仅将一次执行命令(在本例中为“ grep”),并将所有找到的结果作为参数

1.3 What is equal in find | xargs

# find . [args] -print0 | xargs -0 [cmd] # -print0 告诉find将所有结果打印到std,每个结果都用ASCII NUL字符“ \ 000”分隔. -0 告诉xargs输入将以ASCII NUL字符“ \ 000”分隔

1.4 What is different in find | xargs

1.4.1 xargs with -n1

# find .[args] -print0 | xargs -0 -n1 [cmd]   #-n 告诉xarg仅使用一个参数执行命令[cmd](在这种情况下,find仅找到一个文件)。这等于
# find . -exec [cmd] {} \;

 

 

翻译 朗读 复制 正在查询,请稍候…… 重试 朗读 复制 复制 朗读 复制 via 谷歌翻译(国内)

posted @ 2020-08-24 16:12  Suixin随心  阅读(346)  评论(0编辑  收藏  举报