Linux之文件查找find

一、find基础说明

find [dir] [param] [match]

  • -print0 : 不换行输出内容,也可以理解\0 是定界符

二、find使用

2.1 使用文件名查找文件

1
2
find -name "MyCProgram.c" #
find -iname "MyCProgram.c" # 忽略大小写查找

2.2 使用mindepthmaxdepth限定搜索指定目录的深度

1
2
3
find / -maxdepth 2 -name passwd
find / -maxdepth 3 -name passwd
find / -mindepth 3 -maxdepth 5 -name passwd

2.3 在find命令查找到的文件上执行命令

// 搜索后 {}将会被当前文件名取代

find -iname “MyCProgram.c” -exec md5sum {} \;

2.4 相反匹配

find -maxdepth 1 -not -iname “MyCProgram.c”

2.5 使用inode编号查找文件

列子:

1
2
3
4
5
6
7
touch "test-file-name"
touch "test-file-name " //注意有空格
ls -i1 test* //查看两个文件
find -inum 16187430 -exec mv {} new-test-file-name \; # 重命名特殊的文件名
find -inum 804180 -exec rm {} \; # 使用inode编号来删除那些具有特殊符号的文件名

2.6 根据文件权限查找文件

找到当前目录下对同组用户具有读权限的文件,忽略该文件的其他权限

find . -perm -g=r -type f -exec ls -l {} \;

找到对组用户具有只读权限的文件

find . -perm g=r -type f -exec ls -l {} \;

找到对组用户具有只读权限的文件(使用八进制权限形式)

find . -perm 040 -type f -exec ls -l {} \;

2.7 找到home目录及子目录下所有的空文件(0字节文件)

1
2
3
find ~ -empty
find . -maxdepth 1 -empty
find . -maxdepth 1 -empty -not -name ".*" # 只列出当年目录下的非隐藏空文件

2.8 按照文件大小进行查找

1
2
3
4
5
6
7
find . -type f -exec ls -s {} \; | sort -n -r | head -5 # 查找5个最大的文件
find . -type f -exec ls -s {} \; | sort -n | head -5 # 查找5个最小的文件
find . -not -empty -type f -exec ls -s {} \; | sort -n | head -5
find ~ -size +100M //查找比指定文件大的文件
find ~ -size -100M //查找比指定文件小的文件
find ~ -size 100M //查找符合给定大小的文件

2.9 按照文件类型进行查找

1
2
3
4
5
find . -type s //只查找socket文件
find . -type d //查找所有的目录
find . -type f //查找所有的一般文件
find . -type f -name ".*" //查找所有的隐藏文件
find -type d -name ".*" //查找所有的隐藏目录

2.10 通过和其他文件比较修改时间查找文件

显示在指定文件之后做出修改的文件。下面的find命令将显示所有的在ordinary_file之后创建修改的文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ls -lrt
-----------------------------------
total 0
-rw-r----- 1 root root 0 2009-02-19 20:27 others_can_also_read
----r----- 1 root root 0 2009-02-19 20:27 others_can_only_read
-rw------- 1 root root 0 2009-02-19 20:29 ordinary_file
-rw-r--r-- 1 root root 0 2009-02-19 20:30 everybody_read
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 all_for_all
---------- 1 root root 0 2009-02-19 20:31 no_for_all
----------------------------------
find -newer ordinary_file
----------------------
.
./everybody_read
./all_for_all
./no_for_all
----------------------

2.11 给常用find操作取别名

若你发现有些东西很有用,你可以给他取别名。并且在任何你希望的地方执行。
常用的删除a.out文件。
alias rmao=”find . -iname a.out -exec rm {} \;”
rmao

删除c程序产生的core文件。

alias rmc=”find . -iname core -exec rm {} \;”
rmc

2.12 用find命令删除大型打包文件

find / -type f -name .zip -size +100M -exec rm -i {} \;”
//用别名rm100m删除所有大雨100M的
.tar文件
alias rm100m=”find / -type f -name *.tar -size +100M -exec rm -i {} \;”
alias svnadmin=”/usr/local/subversion/bin/svnadmin”

2.13 查找某个字符串在目录下出现次数

1
find <directory> -type f -name "*.php" | xargs grep "<strings>"

是你要找的文件夹;如果是当前文件夹可以省略-type f 说明,只找文件-name “*.c” 表示只找C语言写的代码,从而避免去查binary;也可以不写,表示找所有文件是你要找的某个字符串

2.14 [重要]删除空文件或者目录

删除空目录:

find . -type d -empty | xargs -n 1 rm -rf

删除空文件:

find . -name “*” -type f -size 0c | xargs -n 1 rm -f

参考文档