设为首页 收藏本站
查看: 470|回复: 0

[经验分享] linux命令find的妙用

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-12-7 11:20:58 | 显示全部楼层 |阅读模式


首先,在您的主目录下创建以下示例空文件,以尝试下面提到的某些find命令示例。
# vim create_files.sh

touch MybashProgram.sh
touch mycprogram.txt
touch MyCProgram.txt
touch Program.txt

mkdir backup
cd backup

touch MybashProgram.sh
touch mycprogram.txt
touch MyCProgram.txt
touch Program.txt

# chmod +x !$
chmod +x create_files.sh

[iyunv@aiker01 ~]# ./!$
./create_files.sh

[iyunv@aiker01 ~]# ls -Rt

.:
backup          MybashProgram.sh
MyCProgram.txt  create_files.sh   
Program.txt   mycprogram.txt

./backup:
Program.txt  mycprogram.txt  MyCProgram.txt  MybashProgram.sh

1.使用名称查找文件

这是find命令的基本用法。本示例查找当前目录中所有名称为MyCProgram.txt的文件及其所有子目录。


[iyunv@aiker01 ~]# find ./ -name "MyCProgram.txt"
./MyCProgram.txt
./backup/MyCProgram.txt

2.使用名称查找文件并忽略大小写

这是find命令的基本用法。这个例子查找当前目录及其所有子目录中名为MyCProgram.txt(忽略大小写)的所有文件。

[iyunv@aiker01 ~]# find -iname "MyCProgram.txt"
./mycprogram.txt
./MyCProgram.txt
./backup/mycprogram.txt
./backup/MyCProgram.txt

3.使用mindepth和maxdepth限制搜索到特定的目录级别和搜索的深度

找到从根目录开始的所有子目录下的passwd文件。


[iyunv@aiker01 ~]# find / -name passwd
/etc/passwd
/etc/pam.d/passwd
/usr/bin/passwd
/usr/share/bash-completion/completions/passwd

在根目录下找到passwd文件,向下一级。(即根级别1和子目录级别2)

[iyunv@aiker01 ~]# find / -maxdepth 2 -name passwd
/etc/passwd

在根目录下找到passwd文件,并在两个级别下。(即根级1和两个子目录 - 级别2和3)

[iyunv@aiker01 ~]# find / -maxdepth 3 -name passwd
/etc/passwd
/etc/pam.d/passwd
/usr/bin/passwd

找到子目录级别2和4之间的密码文件。

[iyunv@aiker01 ~]# find / -mindepth 3 -maxdepth 5 -name passwd
/etc/pam.d/passwd
/usr/bin/passwd
/usr/share/bash-completion/completions/passwd

4.对查找命令找到的文件执行命令。

在下面的示例中,find命令计算名称为MyCProgram.txt的所有文件的md5sum(忽略大小写)。{}被当前的文件名取代。

[iyunv@aiker01 ~]# find ./ -iname "MyCProgram.txt" -exec md5sum {} \;
d41d8cd98f00b204e9800998ecf8427e  ./mycprogram.txt
d41d8cd98f00b204e9800998ecf8427e  ./MyCProgram.txt
d41d8cd98f00b204e9800998ecf8427e  ./backup/mycprogram.txt
d41d8cd98f00b204e9800998ecf8427e  ./backup/MyCProgram.txt

5.反匹配查找。

显示名称不是MyCProgram.txt的文件或目录。由于maxdepth为1,因此只会在当前目录下查看。

[iyunv@aiker01 ~]# find -maxdepth 1 -not -iname "MyCProgram.txt"
.
./.bash_logout
./.bash_profile
./.bashrc
./.cshrc
./.tcshrc
./anaconda-ks.cfg
./.bash_history
./.ssh
./create_files.sh
./.viminfo
./MybashProgram.sh
./Program.txt
./backup

6.通过inode编号查找文件。

每个文件都有一个唯一的inode号码,使用它我们可以识别该文件。创建两个具有相似名称的文件。即最后一个空格的文件。

[iyunv@aiker01 ~]# touch "test.txt"
[iyunv@aiker01 ~]# touch "test.txt " # [注:最后有空格]

[iyunv@aiker01 ~]# ls -1 test*
test.txt
test.txt

从ls输出,你不能识别哪个文件最后有空格。使用选项-i,可以查看文件的inode编号,这两个文件的编号不同。

[iyunv@aiker01 ~]# ls -i1 test*
  638020 test.txt
  638021 test.txt

您可以在find命令中指定inode编号,如下所示。在这个例子中,find命令使用inode编号重命名一个文件。

[iyunv@aiker01 ~]# find -inum 638020 -exec mv {} new-test \;

[iyunv@aiker01 ~]# ls -i1 test*  
  638020 new-test
  638021 test.txt

当你想用下面的例子所示的名字很接近的文件进行一些操作时,你可以使用这种技术。例如,名称为 - file?.txt的文件在其中具有特殊字符。如果您尝试执行"rm file?.txt",以下所有三个文件将被删除。因此,请按照以下步骤删除"file?.txt"文件。

[iyunv@aiker01 ~]# touch file{1..5}.txt file\?.txt

[iyunv@aiker01 ~]# ls -t

file5.txt  file4.txt file2.txt file1.txt file3.txt file?.txt

找到每个文件的索引节点号。

[iyunv@aiker01 ~]# ls -i1 file*

772345 file1.txt
772347 file2.txt
854690 file3.txt
991744 file4.txt
991745 file5.txt
991746 file?.txt

使用inode编号删除其中包含特殊字符的文件,如下所示。

[iyunv@aiker01 ~]# find -inum 991746 -exec rm {} \;
[iyunv@aiker01 ~]# ls -i1 file*        #   名称为"file?.txt"的文件现在被删除     
772345 file1.txt
772347 file2.txt
854690 file3.txt
991744 file4.txt
991745 file5.txt

7.根据文件权限查找文件

以下操作是可能的。

查找匹配确切权限的文件
检查给定的权限是否匹配,而不考虑其他权限位
通过给八进制/符号表示进行搜索

对于这个例子,让我们假设该目录包含以下文件。请注意,这些文件的文件权限是不同的。

[iyunv@aiker01 ~]# ll
-rwxr-xr-x  1 root  root   191 Dec  7 00:11 create_files.sh
-rw-------  1 root  root     0 Dec  7 00:51 file1.txt
-rw-------  1 root  root     0 Dec  7 00:51 file2.txt
-rw-------  1 root  root     0 Dec  7 00:51 file3.txt
-rw----r--  1 root  root     0 Dec  7 00:51 file4.txt
-rw----r--  1 root  root     0 Dec  7 00:51 file5.txt
-rw-r--r--. 3 aiker aiker    0 Dec  2 16:11 1.txt

查找具有读取权限的文件。使用以下命令来查找属组可读的所有文件,而不考虑该文件的其他权限。
[iyunv@aiker01 ~]# find . -perm -g=r -type f -name "file*" -exec ls -l {} \;
-rw-r----- 1 root root 0 Dec 7 00:51 ./file1.txt
-rw-r----- 1 root root 0 Dec 7 00:51 ./file2.txt
-rw-r----- 1 root root 0 Dec 7 00:51 ./file3.txt

查找属组仅具有读取权限的文件。

[iyunv@aiker01 ~]# find . -perm g=r -type f -exec ls -l {} \;
----r----- 1 root root 0 Dec  7 00:51 ./file4.txt
----r----- 1 root root 0 Dec  7 00:51 ./file5.txt

查找属组仅具有读取权限的文件[按八进制搜索]

[iyunv@aiker01 ~]# find . -perm 040 -type f -exec ls -l {} \;
----r----- 1 root root 0 Dec 7 00:51 ./file4.txt
----r----- 1 root root 0 Dec 7 00:51 ./file5.txt

8.在当前目录及其子目录中查找所有空文件(零字节文件)

以下命令输出的大多数文件将是由其他应用程序创建的锁定文件和占位符。

[iyunv@aiker01 ~]# find ~ -empty

只列出您的主目录中的所有空文件。

[iyunv@aiker01 ~]# find . -maxdepth 1 -empty
./MybashProgram.sh
./mycprogram.txt
./MyCProgram.txt
./Program.txt

仅列出当前目录中的非隐藏空白文件。

[iyunv@aiker01 ~]# find . -maxdepth 1 -empty -not -name ".*"

./MybashProgram.sh
./mycprogram.txt
./MyCProgram.txt
./Program.txt

9.找到前5个大文件

以下命令将显示当前目录及其子目录中前4个最大的文件。这可能需要一段时间才能执行,具体取决于命令必须处理的文件总数。

[iyunv@aiker01 ~]#  find . -type f -exec ls -s {} \; | sort -n -r | head -4
16 ./.bash_history
8 ./.viminfo.bak
8 ./a.txt
4 ./.viminfo

10.找到前5个小文件

技术和查找更大的文件是一样的,但唯一的区别是升序。
[iyunv@aiker01 ~]# find . -type f -exec ls -s {} \; | sort -n | head -5
0 ./111/222/2.bak
0 ./111/222/3.txt
0 ./111/222/4.txt
0 ./11.txt
0 ./1.txt

在上面的命令中,很可能你只会看到零字节文件(空文件)。因此,您可以使用以下命令列出ZERO字节文件以外的较小文件。

[iyunv@aiker01 ~]# find . -not -empty -type f -exec ls -s {} \; | sort -n  | head -5
4 ./120301.txt
4 ./anaconda-ks.cfg
4 ./.bash_logout
4 ./.bash_profile
4 ./.bashrc

11.使用选项-type查找基于文件类型的文件

只找到套接字文件。

[iyunv@aiker01 ~]# find . -type s

找到所有目录

[iyunv@aiker01 ~]#  find . -type d
.
./.ssh
./1
./test

只找到正常的文件

[iyunv@aiker01 ~]# find . -type f

./.bash_logout

.```
/.bash_profile
./.bashrc


找到所有隐藏的文件

[iyunv@aiker01 ~]# find . -type f -name ".*"
./.bash_logout
./.bash_profile
./.bashrc
./.cshrc
./.tcshrc


找到所有隐藏的目录

[iyunv@aiker01 ~]# find -type d -name ".*"
.
./.ssh

12.通过与其他文件的修改时间进行比较来查找文件。

显示指定文件后修改的文件。以下find命令显示在mycprogram.txt之后创建/修改的所有文件。

[iyunv@aiker01 ~]# ll -rt
-rw-r--r--  1 root  root     0 Dec  7 00:35 new-test
-rw-r--r--  1 root  root     0 Dec  7 00:35 test.txt
----r-----  1 root  root     0 Dec  7 00:51 file5.txt
----r-----  1 root  root     0 Dec  7 00:51 file4.txt
-rw-r-----  1 root  root     0 Dec  7 00:51 file3.txt
-rw-r-----  1 root  root     0 Dec  7 00:51 file2.txt
-rw-r-----  1 root  root     0 Dec  7 00:51 file1.txt

[iyunv@aiker01 ~]# find -newer mycprogram.txt
.
./MyCProgram.txt
./Program.txt
./backup
./backup/MybashProgram.sh
./backup/mycprogram.txt
./backup/MyCProgram.txt
./backup/Program.txt
./test.txt
./new-test
./file1.txt
./file2.txt
./file3.txt
./file4.txt
./file5.txt

13.按大小查找文件

使用-size选项可以按大小查找文件。

查找大于给定大小的文件

#查找〜大小+ 100M

[iyunv@aiker01 ~]# find ~ -size +100M

查找小于给定大小的文件

[iyunv@aiker01 ~]# find ~ -size -1k
/root/1.txt

查找匹配确切给定大小的文件

[iyunv@aiker01 ~]# find ~ -size 2k
/root/anaconda-ks.cfg
/root/.ssh/id_rsa
/root/.viminfo

注意: - 表示小于给定大小,+表示大于给定大小,并且没有符号表示确切的给定大小。

14.为频繁查找操作创建别名

如果你发现一些非常有用的东西,那么你可以把它作为一个别名。并随时执行。

经常删除名为a.out的文件。

[iyunv@aiker01 ~]# alias rmao="find . -iname a.out -exec rm {} \;"
[iyunv@aiker01 ~]# rmao

删除c程序生成的核心文件。

[iyunv@aiker01 ~]# alias rmc="find . -iname core -exec rm {} \;"
[iyunv@aiker01 ~]# rm
rm             rmail          rmail.postfix  rmao           rmc            rmdir          rmmod
[iyunv@aiker01 ~]# rmc

15.使用find命令删除大档案文件

以下命令将删除超过100M的 .zip文件。
`[iyunv@aiker01 ~]# find / -type f -name .zip -size +100M -exec rm -i {} \;`

删除使用别名rm100m(删除100M)超过100M的所有* .tar文件。使用类似的概念,并创建别名,如rm1g,rm2g,rm5g分别去除大于1G,2G和5G的文件大小。

[iyunv@aiker01 ~]# find / -type f -name *.zip -size +100M -exec rm -i {} \;
[iyunv@aiker01 ~]# alias rm100m="find / -type f -name *.tar -size +100M -exec rm -i {} \;"
[iyunv@aiker01 ~]# alias rm1g="find / -type f -name *.tar -size +1G -exec rm -i {} \;"
[iyunv@aiker01 ~]# alias rm2g="find / -type f -name *.tar -size +2G -exec rm -i {} \;"
[iyunv@aiker01 ~]# alias rm5g="find / -type f -name *.tar -size +5G -exec rm -i {} \;"
[iyunv@aiker01 ~]# rm
rm             rm1g           rm5g           rmail.postfix  rmc            rmmod         
rm100m         rm2g           rmail          rmao           rmdir




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-421632-1-1.html 上篇帖子: kali密码离线破解 下篇帖子: Linux C 文件锁的操作
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表