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 {} \;'
- 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文件:
[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}/{} ;