Bash shell...查找命令...带通配符的名称...别名或函数

问题描述 投票:0回答:3

我长期以来一直使用 find 命令来查找当前目录以及与模式匹配的所有子目录中的文件和目录:

find . -name "*.txt" -print
find . -name "Bill*" -print

但我真正想要的是一个能够正确传递通配符的别名或函数。 (我以前可以在 csh 中执行此操作,但现在我使用 bash。)如果正确设置了名为“fn”的别名或函数,我只需输入以下内容即可节省一些时间:

fn "*.txt"
fn "Bill*"

理想情况下,我也想丢掉引号,但我猜这可能是不可能的,因为 shell 会在调用“fn”之前展开它们。

任何建议将不胜感激,并将推迟腕管综合症......:)

已解决:经过下面的讨论,我将其放入我的 .bashrc 文件中:

fn () {
  find . -name "$1" -print
}

注意参数周围的引号:“$1”。 然后可以在文件名表达式周围使用更多引号来调用它:

fn "*.txt"

编辑:函数名称和括号之间必须有空格,所以 fn () { ... [有效] fn() { ... [不起作用]

bash function alias wildcard
3个回答
14
投票

不幸的是,通配符必须用引号引起来,否则 shell 将在可能的情况下扩展它们。

幸运的是,有多种引用它们的方式。

fn '*.txt'
fn Bill\*

7
投票
find ./ -name "*pbs.e*"  -type f -size +10c

0
投票

我是一个从 csh 迁移过来的缺乏经验的 bash 用户。在我的 .cshrc 中,我有别名:

alias f  'find . -name "\!*"'

允许使用不带引号的通配符搜索文件和目录,包括简单的 *.例如:

  • f *.cpp => 列出目录/子目录中的所有 *.cpp 文件
  • f * => 列出目录/子目录中的所有文件
  • f *x* => 列出名称中包含“x”的所有文件

为了在 bash 中实现相同的功能,我在 .bashrc 中添加了以下函数:

f() {
find . -name "$(history 1 | awk -F ' ' '{print $NF}')" -print
} 

这似乎对我有用,不需要引号。

外壳需要有:

set -o history && set -o histexpand

我认为这对于交互式 shell 来说是正确的(至少对我来说是这样)。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.