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

mir*_*ngu 6 grep find

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

find . | grep user   #19 chars typed
Run Code Online (Sandbox Code Playgroud)

必须写成只找到:

find . -path "user*" #21 chars typed
Run Code Online (Sandbox Code Playgroud)

当使用一个用于查找文件的命令时输入更多字符感觉有点傻……然后组合使用它们中的两个。

有什么方法可以让使用 only find 在键入的字符方面更有效?

Kus*_*nda 11

是的,

ff () {
    find . -path "*$1*"
}
Run Code Online (Sandbox Code Playgroud)

这个函数被调用为

ff user
Run Code Online (Sandbox Code Playgroud)

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

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


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

ff () {
    find . -name "*$1*"
}
Run Code Online (Sandbox Code Playgroud)

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

ff () {
    find . -type f -name "*$1*"
}
Run Code Online (Sandbox Code Playgroud)

请注意,您的命令

find . -path "user*"
Run Code Online (Sandbox Code Playgroud)

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

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


Sté*_*las 6

假设您想最终对这些文件做一些事情,您可以让您的 shell 完成系统向您显示该列表并为它们选择条目。

例如,使用zsh

$ echo **/*用户*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
Run Code Online (Sandbox Code Playgroud)

我建议您运行compinstall以调整您的完成偏好。

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

这也有提供排序列表的好处,ls --colour除了, 之外,您还可以获得彩色列表(à la GNU ),如果添加/,则 @足以帮助您识别文件类型:

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

到您的~/.zshrc.

它还可以避免带有换行符或其他不可打印字符的文件名问题,因为与find's 输出相反的完成输出是供人类消费的。

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