前言
本文是专栏雕虫小技中的新一篇,记录总结工作中的一些小技巧,以飨掘友。
不知各位掘友日常开发中搜索本地磁盘上某个文件或者某个重要字符内容,但又不知道在哪里,又或不知道是哪个文件,诸位是如何解决的? 这样场景很多。
老虾在准备技术面试过程中,想把Java或者Kotlin关于反射的一些例子走一遍,加深印象,记得以前写过这些小demo,经年累月,文件夹以及文件很多, 怎么办?
Android源码开发中,需要在动辄几个G,几十G的文件中寻找framework资源文件或者resource中某个字符串,怎么办?
只想查找Java类型的文件,然后在Java文件中去搜寻想要的某个内容, 想一次性搞定,怎么办? ...
今天老虾就把以前在运维同事学到的小技巧分享给掘友,前运维同事,那指法了得,find, grep, vim, cat... 常用快捷键+命令,让人眼花缭乱,工作效率杠杠的。在前同事的影响下,我的日常search习惯也慢慢转变为命令行,即使开发平台是Windows, 我依然设法使用类Linux环境 --- MINGW 使用find/grep去查找文件或者关键字内容。Windows中,我会选用git bash(MINGW64) ,如何下载安装,链接在此 git-scm.com/download/wi…
先给为敬
几个日常使用频率高的find, grep 基本覆盖了开发者面对的日常搜索情形。
1. find -name/-iname "文件名的key word"
2. find -name/-iname -type d "文件夹key word"
3. find -name "key word" -exec rm -rf {} \;
4. find -name "xxx.java" -exec grep -rn "key word" \;
find老哥,你先行
上图是老虾日常写的一部分demo,经年累月,现在要去快速找到之前写的反射例子Java文件,肯定是记不住的,也没有必要记住啊, 有find老哥在。现在依稀记文件名好像包含了 Reflct ,大小写,我也不确定,
find 文件 -name / -iname
$ find -name "Reflect*.java" ==> -name 是大小写敏感的,加上通配符*
./JavaDemo/src/ReflectionDemo.java
$ find -name "*Reflect*.java" ==> -name 是大小写敏感的, 加上通配符*
./JavaDemo/src/ReflectionDemo.java
./JavaDemo/src/TestReflection.java
./JavaDemo/src/TestReflection2.java
find -name "*reflect*.java" ==> -name 是大小写敏感的, 可以使用 -iname, 加上通配符*
没有任何匹配结果
$ find -iname "*reflect*.java" ==> 使用-iname, 以及通配符
./JavaDemo/src/ReflectionDemo.java
./JavaDemo/src/TestReflection.java
./JavaDemo/src/TestReflection2.java
find 目录
想把当前目录及其子目录中的src文件夹找到显示出来,怎么办?
$ find -type d -name[或者-iname] "src"
./android-mvp/IDouban/app/src
./android-mvp/IDouban/lib/src
./android-paging-master/app/src
省略....
$ find -iname "java" -type d -iname "java*"
./android-mvp/IDouban/app/src/androidTest/java
./android-mvp/IDouban/app/src/main/java
./android-mvp/IDouban/app/src/test/java
./android-mvp/IDouban/lib/src/main/java
省略....
find 组合其他cmd
使用find+其他cmd,常用的有
- find + rm 删除文件夹
- find + rm 删除文件
- find + grep 查找指定条件文件中的指定内容
find + rm 删除文件夹
经年累月的各种demo运行后,会有很多build文件夹,这些也是占用磁盘空间团伙,删除之。
先用 find查找build文件夹 看看效果。
$ find -name "build" -type d
./app/build
./customview/build
./memoryleak/build
./purekotlin/build
再来find + rm 组合删除build
$ find -name "build" -type d -exec rm -rf {} \; ==> 注意结尾有个 \;
find: ‘./app/build’: No such file or directory
find: ‘./customview/build’: No such file or directory
find: ‘./memoryleak/build’: No such file or directory
find: ‘./purekotlin/build’: No such file or directory
NOTE: 上面显示
No such...其实是删除成功了的,记得以前纯Linux下的没有找个提示的,anyway,find + rm 删除文件夹 搞定!
find + rm 删除文件
同样的操作,找到你想删除的文件 然后删除他们。
$find -name "*Activity.class" -exec rm -rf {} \;
$ find -name "*Activity.class" -exec rm -rf {} \;
指定类型的文件 找到并删除了!
find + grep
这个组合也是经常用到,而且好用。 单独的grep是要全部查询,假如你知道某个字符串在某个特定的文件中,没必要整个目录挨个文件去搜寻。回到场景中,我要找文件名字中含有Test关键字的java文件中 含有 public void main 的Java文件。
$ find -name "Test*.java" -exec grep -rn "public static void main" \;
NOTE: 这套组合命令 有个小问题,命令执行后显示的结果列表会重复好几次, 我是没找到原因, 估计我这种组合搭配 姿势不对。
要是使用 这套 $ find -name "Test*.java" -exec grep -rn "public static void main" {} \; 显示的结果又太单调了。
grep 老哥
展示完常用的find, 那就必须提到grep, 你可以理解,它是查找内容的,查询关键字在哪些文件中。也是高频cmd。不过,老虾我基本是 配合find使用, 再来一次。
$ find -iname "chapter*.kt" -exec grep -rn "main()" * \;
kotlin/src/main/kotlin/algorithms/Algorithms01.kt:3:fun main() {
kotlin/src/main/kotlin/algorithms/Rabbit.kt:3:fun main() {
kotlin/src/main/kotlin/algorithms/Words.kt:7:fun main() {
kotlin/src/main/kotlin/blog/extension/DelegatedProperty.kt:6://fun main() {
kotlin/src/main/kotlin/blog/extension/DelegatedProperty.kt:37://fun main() {
grep 也是有好多参数,选项的,按需去查询即可。