Linux find 实战

简介: Linux find 实战

1、搜索文件


-name 匹配名字,支持正则表达式


/aplog目录下查找以.txt结尾的文件名

find /home -name "*.txt"

-iname 忽略大小写匹配名字

find . -type 类型参数

在/aplog下搜索管道文件

find /aplog -type p

事实上大多数时候我们都会忘记具体在哪个目录下,不过使用 从根目录遍历会很慢。


搜索大于100k的文件

find /home/scripts/test -type f -size  +100k
[root@P1QMSPL2RTM01 test]# find /home/scripts/test -type f -size  +100k
/home/scripts/test/history_6379_A5312.log
/home/scripts/test/history_6379_A4377.log
/home/scripts/test/history_6379_A3372.log
/home/scripts/test/history_6379_A3610.log
/home/scripts/test/history_6379_L8100.log
/home/scripts/test/history_6379_A3850.log
/home/scripts/test/history_6379_A5915.log
/home/scripts/test/history_6379_A5300.log
/home/scripts/test/history_6379_C7800.log
/home/scripts/test/history_6379_L6645.log
/home/scripts/test/history_6379_C33A0.log
/home/scripts/test/history_6379_A7500.log
/home/scripts/test/history_6379_L5500.log
/home/scripts/test/history_6379_C4555.log
/home/scripts/test/history_6379_C4300.log
/home/scripts/test/history_6379_C3353.log
/home/scripts/test/history_6379_A7504.log
/home/scripts/test/history_6379_A1855.log
/home/scripts/test/history_6379_CP350.log
/home/scripts/test/history_6379_A5470.log
/home/scripts/test/history_6379_A3376.log
/home/scripts/test/history_6379_L2112.log
/home/scripts/test/history_6379_A5953.log
/home/scripts/test/history_6379_C3341.log
/home/scripts/test/history_6379_A5350.log
/home/scripts/test/history_6379_A2831.log


如果不希望有绝对路径,则把find后面路径直接拿掉即可。

[root@P1QMSPL2RTM01 test]# find -type f -size  +100k
./history_6379_A5312.log
./history_6379_A4377.log
./history_6379_A3372.log
./history_6379_A3610.log
./history_6379_L8100.log
./history_6379_A3850.log
./history_6379_A5915.log
./history_6379_A5300.log
./history_6379_C7800.log
./history_6379_L6645.log
./history_6379_C33A0.log

2、搜索目录


3、指定目录搜索指定格式的文件


搜索/home/scripts/ 下以 sh结尾的所有文件

[root@gptest01 scripts]# find /home/scripts/ -type f -path "*.sh"
/home/scripts/formatVmstat_start.sh
/home/scripts/redis/insertJgeCnt.sh
/home/scripts/redis/evaluateMem.sh
/home/scripts/redis/evaluateHisOpeMem.sh
/home/scripts/redis/evaluateResult.sh
/home/scripts/redis/insertHistory.sh
/home/scripts/redis/insertResult.sh
/home/scripts/redis/del.sh
/home/scripts/redis/inersertOpehisKey.sh
/home/scripts/redis/istAll.sh
/home/scripts/formatVmstat_eth0.sh
/home/scripts/formatVmstat_bond1.sh
/home/scripts/formatVmstat_bak.sh

4、使用管道删除大量文件


ansible]# ls tmp/|wc -l
406278
.ansible]# time rm -rf ./tmp/*
-bash: /bin/rm: Argument list too long
real  0m7.728s
user  0m4.686s
sys 0m0.408s

遇到此种情况可选择使用find 结合管道来操作

.ansible]# time find /home/.ansible/ -name  "a*"  | xargs rm -rf "a*"
real  33m10.841s
user  0m7.251s
sys 0m53.530s

5、统计找到的文件大小


匹配到该目录下所有的txt 并统计大小。注意就算匹配到其他分区的文件,du 也会统计的。

~]# find /home/scripts/ -type f -name "*.txt" -print0 | xargs -0 du -csh 
14M /home/scripts/vmstat158.txt
4.0K  /home/scripts/tune/GP/stracePostgrePID.txt
0 /home/scripts/vmstat103.txt
13M /home/scripts/vmstat.txt
27M total

6、利用正则精确匹配


在使用find的时候,如果搜索路径范围比较大,例如find /。 这个会非常的耗时,如果能事先将一部分使用正则过滤掉,效能会好很多。

find . -name "*.txt" | xargs pcregrep 'regex' -o
xargs会将find结果作为grep的输入,防止find结果过多无法处理
-o表示只输出匹配的字符串,这样我们就可以把正则匹配到的结果拿到了。

7、find 找前两小时的文件,只遍历一层


查找/mnt/dataTransfer 目录,-maxdepth 1 只找当前目录,这个参数有时候是很关键的。


刚开始我并没有使用这个参数,也没有指定文件类型,结果悲剧了,把该目录下的子目录中的文件也删除了。

 dataTransfer]# find /mnt/dataTransfer/ -maxdepth 1 -type f -ctime -$(awk -v c="120" 'BEGIN{print c/60/24}')

查找三小时前的file并删除 -- update 2021年4月12日09:11:14


#1 */6 * * * /usr/bin/ansible *** -m shell -a 'find /mnt/dataTransfer/file2GP/  -type f -mtime $(awk -v c="150" 'BEGIN{print c/60/24}') -exec rm -f {} \;'

2021042018435563.png

  • atime:(access time)显示的是文件中的数据最后被访问的时间,比如系统的进程直接使用或通过一些命令和脚本间接使用。(执行一些可执行文件或脚本)
  • mtime: (modify time)显示的是文件内容被修改的最后时间,比如用vi编辑时就会被改变。(也就是Block的内容)
  • ctime: (change time)显示的是文件的权限、拥有者、所属的组、链接数发生改变时的时间。当然当内容改变时也会随之改变(即inode内容发生改变和Block内容发生改变时)
  • --update 2022年8月10日11:21:29

后来发现 有这个参数:


-amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算


-mmin<分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算;

访问时间 (-atime/天,-amin/分钟):用户最近一次访问时间。
修改时间 (-mtime/天,-mmin/分钟):文件最后一次修改时间。
变化时间 (-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。

8、统计项目代码总行数


领导要求去看代码,我说看到什么程度? 领导说:项目有多少行?......


这个问题以前没咋考虑过?难道我要一个一个打开去统计,显然这样不合适。


使用find + xargs 可以达到效果。看 hms代码一共12854行

$ find ./ -iname "*.java"|xargs wc -l
    28 ./src/main/java/com/navi/BeanConfig.java
   180 ./src/main/java/com/navi/constant/GenericDef.java
    30 ./src/main/java/com/navi/controller/DealErrorController.java
    15 ./src/main/java/com/navi/controller/PageController.java
    80 ./src/main/java/com/navi/controller/QueryErrorQueueInfoController.java
 ....
   168 ./src/test/java/com/navi/redis/TestRedisConfig.java
   101 ./src/test/java/com/navi/RemoteCommandUtil.java
 12854 total

-name 是不区分大小写的, 如果匹配文件名字时要区分大小写则需要使用-iname   i就是case insensitive 大小写敏感的意思

 -iname pattern
              Like  -name,  but  the  match  is case insensitive.  For example, the patterns ‘fo*’ and ‘F??’ match the file names ‘Foo’, ‘FOO’, ‘foo’, ‘fOo’, etc.   In these patterns, unlike
              filename expansion by the shell, an initial ‘.’ can be matched by ‘*’.  That is, find -name *bar will match the file ‘.foobar’.   Please note that you should quote patterns  as
              a matter of course, otherwise the shell will expand any wildcard characters in them.

如果类名中包含有空格,这个就不好使了

9、查询出数字开头的文件并移动到指定文件夹


批量生成文件:

tmp]# touch $(echo {1..10}.log)
tmp]# ll -ths
total 336K
   0 -rw-r--r-- 1 root root    0 Dec 27 16:09 10.log
   0 -rw-r--r-- 1 root root    0 Dec 27 16:09 1.log
   0 -rw-r--r-- 1 root root    0 Dec 27 16:09 2.log
   0 -rw-r--r-- 1 root root    0 Dec 27 16:09 3.log
   0 -rw-r--r-- 1 root root    0 Dec 27 16:09 4.log
   0 -rw-r--r-- 1 root root    0 Dec 27 16:09 5.log
   0 -rw-r--r-- 1 root root    0 Dec 27 16:09 6.log
   0 -rw-r--r-- 1 root root    0 Dec 27 16:09 7.log
   0 -rw-r--r-- 1 root root    0 Dec 27 16:09 8.log
   0 -rw-r--r-- 1 root root    0 Dec 27 16:09 9.log

使用find先定位到文件。

tmp]# find ./ -maxdepth 1 -regex "./[0-9]+.log"
./10.log
./5.log
./7.log
./9.log
./8.log
./4.log
./3.log
./6.log
./1.log
./2.log

使用xargs -i参数将分批移动到指定文件。需求完成

tmp]# find ./ -maxdepth 1 -regex "./[0-9]+.log" | xargs -i mv {} ./to_delete/
[root@iZ8vbis43wevefdej5xq5yZ tmp]# ls -lth ./to_delete/
total 0
-rw-r--r-- 1 root root 0 Dec 27 17:28 10.log
-rw-r--r-- 1 root root 0 Dec 27 17:28 1.log
-rw-r--r-- 1 root root 0 Dec 27 17:28 2.log
-rw-r--r-- 1 root root 0 Dec 27 17:28 3.log
-rw-r--r-- 1 root root 0 Dec 27 17:28 4.log
-rw-r--r-- 1 root root 0 Dec 27 17:28 5.log
-rw-r--r-- 1 root root 0 Dec 27 17:28 6.log
-rw-r--r-- 1 root root 0 Dec 27 17:28 7.log
-rw-r--r-- 1 root root 0 Dec 27 17:28 8.log
-rw-r--r-- 1 root root 0 Dec 27 17:28 9.log

10、find 和xargs 删除文件的坑


默认情况下xargs使用空格作为分割符


如果有三个txt文件:

d0d7b4dcc5654d0fa5236b12bd96eaf0.png

[root@hadoop100 test]# find . -type f -name "*.txt"
./text.txt
./bashrc text.txt
[root@hadoop100 test]#
[root@hadoop100 test]#
[root@hadoop100 test]#
[root@hadoop100 test]# find . -type f -name "*.txt" | xargs rm -rf
You have mail in /var/spool/mail/root
[root@hadoop100 test]#
[root@hadoop100 test]# ls -l
total 0
-rw-r--r--. 1 root root 0 Feb  7 14:17 bashrc text.txt
[root@hadoop100 test]#

这样做很危险,有可能会误删文件。我们无法预测find命令输出的分隔符究竟是什么(究竟是'\n'还是' ')。如果有文件名中包含空格符(' '),xargs会将其误认为是分隔符。例如,bashrc text.txt会被视为bashrc和text.txt。因此上面的命令不会删除bashrc text.txt,而是会把bashrc删除。


使用find命令的-print0选项生成以空字符('\0')作为分隔符的输出,然后将其作为xargs命令的输入。下列命令会查找并删除所有的.txt文件:


man的解释:

print  the  full file name on the standard output, followed by a null character (instead of the newline character that -print uses).  This allows file names that contain newlines or

             other types of white space to be correctly interpreted by programs that process the find output.  This option corresponds to the -0 option of xargs.

[root@hadoop100 test]# find . -type f -name "*.txt" -print0 | xargs -0 rm -rf

11、getopts传参配合find  批量上传本地jar到nexus


#!/bin/bash
# @date 2022年9月2日11:26:51
# @author ninesun
# nexushttp: http://10.50.10.31:31712/repository/maven-releases/
#!/bin/bash
# copy and run this script to the root of the repository directory containing files
# this script attempts to exclude uploading itself explicitly so the script name is important
# Get command line params
# 使用方式: bash uploadJarWithscripts.sh -u admin -p chot123  -r http://10.50.10.31:31712/repository/maven-releases/
while getopts ":r:u:p:" opt; do
  case $opt in
    r) REPO_URL="$OPTARG"
    ;;
    u) USERNAME="$OPTARG"
    ;;
    p) PASSWORD="$OPTARG"
    ;;
  esac
done
find . -type f -not -path './uploadJarWithscripts\.sh*' -not -path '*/\.*' -not -path '*/\^archetype\-catalog\.xml*' -not -path '*/\^maven\-metadata\-local*\.xml' -not -path '*/\^maven\-metadata\-deployment*\.xml' | sed "s|^\./||" | xargs -I '{}' curl -s -u "$USERNAME:$PASSWORD" -X PUT -v -T {} ${REPO_URL}/{} ;
相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
目录
相关文章
|
18天前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
53 6
|
5月前
|
存储 网络协议 Ubuntu
【Linux开发实战指南】基于UDP协议的即时聊天室:快速构建登陆、聊天与退出功能
UDP 是一种无连接的、不可靠的传输层协议,位于IP协议之上。它提供了最基本的数据传输服务,不保证数据包的顺序、可靠到达或无重复。与TCP(传输控制协议)相比,UDP具有较低的传输延迟,因为省去了建立连接和确认接收等过程,适用于对实时性要求较高、但能容忍一定数据丢失的场景,如在线视频、语音通话、DNS查询等。 链表 链表是一种动态数据结构,用于存储一系列元素(节点),每个节点包含数据字段和指向下一个节点的引用(指针)。链表分为单向链表、双向链表和循环链表等类型。与数组相比,链表在插入和删除操作上更为高效,因为它不需要移动元素,只需修改节点间的指针即可。但访问链表中的元素不如数组直接,通常需要从
278 2
|
3月前
|
存储 Linux Shell
linux查找技巧: find grep xargs
linux查找技巧: find grep xargs
40 13
|
3月前
|
Linux 应用服务中间件 nginx
|
3月前
|
机器学习/深度学习 存储 Linux
linux中强大且常用命令:find、xargs、grep
linux中强大且常用命令:find、xargs、grep
131 9
|
3月前
|
Docker 容器
14 response from daemon: open \\.\pipe\docker_engine_linux: The system cannot find the file speci
14 response from daemon: open \\.\pipe\docker_engine_linux: The system cannot find the file speci
40 1
|
3月前
|
SQL 移动开发 Linux
linux下find、grep命令详解
linux下find、grep命令详解
177 8
|
3月前
|
监控 Linux Shell
30 个实用的 Linux 命令贴与技巧,提升你的效率(附实战案例)
本文介绍了30个实用的Linux命令及其应用场景,帮助你提升命令行操作效率。涵盖返回目录、重新执行命令、查看磁盘使用情况、查找文件、进程管理、网络状态监控、定时任务设置等功能,适合各水平的Linux用户学习和参考。
|
3月前
|
存储 Ubuntu Linux
linux中的find 命令详细用法
本文介绍了如何将 `find` 命令与 `exec` 结合使用,通过具体示例展示了多种应用场景,如显示文件属性、重命名文件、收集文件大小、删除特定文件、执行工具、更改文件所有权和权限、收集 MD5 值等。文章还探讨了 `{} \;` 和 `{} +` 的区别,并演示了如何结合 `grep` 命令进行内容搜索。最后,介绍了如何在一个 `find` 命令中使用多个 `exec` 命令。这为 Linux 用户提供了强大的文件管理和自动化工具。
|
4月前
|
Linux 文件存储 数据安全/隐私保护
Linux用户组管理实战:创建、管理与删除的全面指南
在 Linux 系统中,用户组管理是实现权限控制和资源共享的关键。本文档详细介绍如何创建用户组、管理用户组成员及查看与删除用户组。首先,通过 `groupadd` 命令创建新用户组,并在 `/etc/group` 文件中记录。接着,利用 `usermod` 和 `gpasswd` 命令来添加或删除用户组成员,其中 `gpasswd` 提供更灵活的管理方式。最后,使用 `getent` 或直接读取 `/etc/group` 查看用户组信息,并通过 `groupdel` 删除空用户组。这些操作有助于高效管理和保护系统资源。
326 4