在这种情况下,是否有可能使 find 比 Find + Grep 更高效地使用?

在这种情况下,是否有可能使 find 比 Find + Grep 更高效地使用?

我经常发现自己根据文件名称的一部分在当前文件夹和子文件夹中搜索文件。在我看来,在这种情况下,find + grep需要的输入比仅需要更少的输入find。例如

find . | grep user   #19 chars typed

只能用 find 来写:

find . -path "user*" #21 chars typed

当使用一个旨在查找文件的命令时输入更多字符感觉有点愚蠢......然后组合使用其中两个。

有什么方法可以使 only find 在输入字符方面更加高效吗?

答案1

是的,

ff () {
    find . -path "*$1*"
}

该函数被调用为

ff user

并将返回当前目录中或当前目录下包含给定字符串的所有路径名(文件、目录等)。

函数定义应进入您的~/.bashrc文件(或 shell 使用的相应 shell 初始化文件),并且可在您启动的下一个交互式 shell 中使用。


以下变体仅考虑路径名的文件名部分:

ff () {
    find . -name "*$1*"
}

如果您还想将结果限制为仅常规文件,然后添加-type ffind调用中:

ff () {
    find . -type f -name "*$1*"
}

请注意您的命令

find . -path "user*"

永远不会输出任何东西。这是因为每个考虑的路径名都以..

最后一句警告:我假设这将被交互使用,并且您将使用您的眼睛在结果。如果您打算在脚本中使用它或对函数返回的文件名进行任何循环,请参阅“为什么循环查找的输出是不好的做法?”。

答案2

假设您最终想要对这些文件执行某些操作,您可以让 shell 完成系统向您显示该列表并为它们选择条目。

例如,与zsh

$回显**/*用户*Tab
完成扩建
[4/用户] 1/2/3/用户
完成所有扩展
1/2/3/用户 4/用户
完成原件
**/*用户*

然后使用方向键选择Alt+A要选择的文件(或带有 的文件)(反白显示,上面用 表示[...])。另请参阅Ctrl+D仅列出完成情况而不开始选择任何完成情况。

这里~/.zshrc至少包含:

zstyle ':completion:*' completer _expand _complete
zstyle ':completion:*' menu select=0
zstyle ':completion:*' verbose true
zstyle ':completion:*' format 'Completing %d'
zstyle ':completion:*' group-name ''
autoload -Uz compinit
compinit

我建议你跑步compinstall来调整你的完成偏好。

上面**/*user*返回的文件姓名包含user(不包括隐藏文件和隐藏目录中的文件,(D)如果您想要它们回来,请添加 glob 限定符)。对于文件小路包含user,更改为(您的**/*~^*user*需要)。set -o extendedglob~/.zshrc

这还有一个好处是提供一个排序列表,如果您添加以下ls --colour内容,除了 , 之外,您还可以获得彩色列表(类似于 GNU )/@足以帮助您识别文件类型:

eval "$(dircolors ~/.dircolors)"
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}

给你的~/.zshrc.

它还可以避免文件名中包含换行符或其他不可打印字符的问题,因为完成输出而不是 的find输出是供人类使用的。

zsh也没有关于包含不形成有效字符的字节序列的文件名find(至少是 GNU的)问题(例如,在 UTF-8 语言环境中时无法在目录中找到文件)。findfind -path '*user*'user$'St\xe9phane'

答案3

find如果没有定义路径,GNU 版本默认为当前目录。

find -name "user*" # 18 chars typed plus enter.

答案4

如果你使用,一次,pip install grin您将获得grin&实用程序的命令grind(恐怕目前只有 python 2)。

使用grind你的查询变成:

grind user*

这是 11 个字符。

当然,如果你采用 python 方式,你的路径上总是可以有一个名为 floc 的文件,该文件是为执行你最常执行的搜索而定制的:

#!/usr/bin/env python3
from glob import glob
import sys
for arg in sys.argv[1:]:
   print('\n'.join(glob('**/{}*'.format(arg), recursive=True)))

然后chmod +x floc使其可执行。然后您的查询将变为:

floc user

最多 9 个字符。当然,您也可以为原始命令创建 shell 别名以获得类似的减少。

相关内容