简介
三种不同的任务,三套工具家族:find实时遍历文件系统,可按任意属性过滤;locate从预建索引中即时返回结果;grep在文件内部搜索。fd、plocate和rg是它们更现代、更快的对应版本。按名称查找文件
find需要指定起始目录;-iname不区分大小写匹配。fd默认搜索当前目录,忽略隐藏文件和 git 忽略的文件,并使用正则表达式模式。find . -iname"*report*"find / -name"[fileName]"2>/dev/nullfd [query]fd -e pdf [query]
从/搜索时会因无法读取某些目录而打印权限错误;2>/dev/null可隐藏这些错误。按类型、大小和年龄查找
测试条件可以自由组合:数字前加-7表示"小于",+7表示"大于",单独的7表示"恰好等于"。find . -type f -size+10M -size-100Mfind . -type f -emptyfind . -type d -emptyfind . -mmin-60find . -mtime-7find . -mtime+30
| 测试条件 | 说明 |
|---|
-type f / -type d | 文件 / 目录 |
-size +10M | 大于 10 MB |
-mmin -60 | 内容在 60 分钟内修改过 |
-mtime -7 | 内容在 7 天内修改过 |
-cmin / -ctime | 状态(权限、所有者)变更 |
-atime | 最后访问时间 |
-empty | 空文件或空目录 |
-user name | 属于某用户 |
对查找结果执行操作
-exec对每条匹配结果运行命令;{}被替换为文件名。以+结尾时,每次调用传递多个文件而非逐个传递。-delete直接删除匹配项。find . -name"*.tmp"-deletefind . -name"*.sh"-execchmod+x {} +find . -type f -execgrep-l"TODO" {} +
先测试破坏性命令:将-delete或 -exec rm 替换为-print,检查列表无误后再正式执行。索引搜索
locate从索引中即时查找路径名,而非扫描磁盘。索引由updatedb定期更新,因此非常新的文件可能尚未收录。plocate是更快的现代实现。locate [query]plocate [query]sudo updatedb
搜索文件内容
grep -r递归搜索目录;-n显示行号,-i忽略大小写,-l仅列出文件名。rg(ripgrep)默认递归,跳过 git 忽略的文件,在大型目录树中速度更快。grep"[query]" [file]grep-rni"[query]" [path]grep-rl"[query]" [path]rg "[query]"rg -t py "[query]"ag "[query]"
通过管道将任意命令的输出传给 grep 进行搜索。history | grep"[phrase]"ps aux | grep"[processName]"
模糊查找
fzf在你输入时交互式过滤任意列表。单独使用时模糊查找文件;与其他命令结合则成为万能选择器。fzfvim $(fzf)history | fzf
fzf 的 Shell 集成绑定了Ctrl+R(历史命令)、Ctrl+T(文件)和Alt+C(进入目录)。查找命令
which [command]whereis [command]type [command]command -v [command]
whereis还能查找手册页和源码。type是 Shell 自身的视角,能正确报告别名、函数和内置命令。