程序人日常生产力提升小技巧find, grep [抛砖引玉]

引言

不知各位掘友日常要去查询个某个文件或者某个重要内容,但是不知道在哪里,又不知道是哪个文件,用哪些方法快速的搞定? 特别是, 文件名称不记得,文件类型不记得... 这样的场景很多的:

  1. 在准备技术面试过程中,想把Java或者Kotlin关于反射的一些例子走一遍,加深印象,记得以前写过这些小demo代码, 但是经年累月,电脑上各种小demo很多, 怎么办?
  2. Android源码开发中,需要寻找framework资源文件或者resource中某个字符串,怎么办?
  3. 只想查找java类型的文件,然后在java文件中去搜寻想要的某个内容, 想一次性搞定,怎么办?

...

印象深刻的是以前一位运维同事,在Linux下,使用常用的命令+快捷键,那真是眼花缭乱。find,grep, vim, cat... 在Linux平台下,以前跟Android源码打交道有6,7年的时间,也渐渐习惯使用find, grep等命令来查找,以至于我转换到Windows平台,还是喜欢安装类似MINGW环境,去查询文件或者内容。我不习惯在Android Studio中使用git,在Windows中安装了git bash(MINGW64), 下文的各种查询操作基于git bash.

上面仅是某个文件夹下的demo,就以这个目录为例,来做些我需要的操作。

find

我不记得以前写反射的例子在哪个文件了,只记得,文件名好像包含了 Reflct ,大小写,我也不确定,怎么办?

find -name / -iname

bash 复制代码
$ find -name "Reflect*.java"  ==> -name 是大小写敏感的
./JavaDemo/src/ReflectionDemo.java
bash 复制代码
$ find -name "*Reflect*.java" ==> -name 是大小写敏感的
./JavaDemo/src/ReflectionDemo.java
./JavaDemo/src/TestReflection.java
./JavaDemo/src/TestReflection2.java
bash 复制代码
 find -name "*reflect*.java"  ==> -name 是大小写敏感的, 可以使用 -iname
 没有任何匹配结果
bash 复制代码
$ find -iname "*reflect*.java" ==> -iname
./JavaDemo/src/ReflectionDemo.java
./JavaDemo/src/TestReflection.java
./JavaDemo/src/TestReflection2.java

find 目录

想把当前目录及其子目录中的src文件夹找到显示出来,怎么办?

bash 复制代码
$ find -type d -name[或者-iname] "src"
./android-mvp/IDouban/app/src
./android-mvp/IDouban/lib/src
./android-paging-master/app/src
./android-sample/RecyclerView/Application/src
./JavaDemo/src
./kotlin/src
./kotlin-tutorials/src
./testDemo/src
bash 复制代码
$ find -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
./android-paging-master/app/src/main/java
./android-sample/RecyclerView/Application/src/main/java
./JavaDemo
./kotlin/src/main/java
./testDemo/.gradle/5.2.1/javaCompile
./testDemo/src/main/java
./testDemo/src/test/java

find 组合其他cmd

使用find+其他cmd,常用的也就几个。

find + rm 删除文件夹

经年累月的各种demo运行后,会有很多build文件夹,这些也是占用磁盘空间, 可以删除。 先 用 find查找下

bash 复制代码
$ find -name "build" -type d
./app/build
./customview/build
./memoryleak/build
./purekotlin/build
bash, 复制代码
$ 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

上面显示 No such... 其实是删除成功了的,记得以前纯Linux下的没有找个提示的,anyway,find + rm 搞定

find + rm 删除文件

同样的操作,找到你想删除的文件 然后删除他们。

bash 复制代码
$find -name "*Activity.class" -exec rm -rf {} \;
shell 复制代码
$ find -name "*Activity.class" -exec rm -rf {} \;

解决了。

find + grep

这个组合也是经常用到的,好用。 单独的grep是要全部查询,知道某个字符串在特定的文件中,没必要整个目录挨个文件去搜寻。回到实际的例子,我要找文件名字中含有Test关键字的java文件中 含有 public void main 的Java文件。

bash, 复制代码
$ find -name "Test*.java" -exec grep -rn "public static void main" \;
这套组合命令 有个问题,显示的结果 它会重复好几次, 我是没找到原因

要是使用 这套 $ find -name "Test*.java" -exec grep -rn "public static void main" {} \; 显示的结果又太单调了。

grep

展示完常用的find, 那就必须提到grep, 你可以理解,它是查找内容的,查询关键字在哪些文件中。也是高频cmd。不过,现在我基本是 配合find使用, 再来一次。

kotlin 复制代码
$ 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 也是有好多参数,选项的,按需去查询即可。

关于rg,放到下篇说下,这些cmd的使用都是些 雕虫小技,文章主打短小。

持续汇总中

相关推荐
怀旧,20 分钟前
【Linux网络编程】5. 应用层协议 HTTP
linux·网络·http
SurpriseDPD38 分钟前
Linux 内核基础知识:READ_ONCE、内存屏障与指令重排
linux·系统架构
D4c-lovetrain1 小时前
Linux个人心得29(深入理解K8S Pod优先级与驱逐机制:从原理到实战踩坑)
linux·运维·kubernetes
小吴伴学者1 小时前
Linux RX报文处理全流程解析
linux
小侯不躺平.1 小时前
C++ Boost库【2】 --stringalgo字符串算法
linux·c++·算法
夏乌_Wx2 小时前
计算机网络实践项目 | 云相册(文件互传与管理系统)
linux·计算机网络
用户805533698032 小时前
嵌入式Linux驱动开发——设备树语法与编译工具——读懂这张"藏宝图"
linux·嵌入式
原来是猿2 小时前
网络计算器:理解序列化与反序列化(下)
linux·开发语言·网络·网络协议·json·php
木木_王2 小时前
嵌入式学习 | STM32裸板驱动开发(Day01)入门学习笔记(超详细完整版|点灯实验 + 库函数代码 + 原理全解)
linux·驱动开发·笔记·stm32·学习