【问题标题】:Bash shell...find command...names with wildcards...alias or functionBash shell...查找命令...带有通配符的名称...别名或函数
【发布时间】:2013-10-14 02:50:24
【问题描述】:

我长期使用 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() { ... [不起作用]

【问题讨论】:

  • 你需要一个函数,而不是别名,因为参数需要放在展开的中间。 fn() { find . -name "$1" -print; }
  • 我试过这个。但是函数中的“$1”会在当前目录中展开。因此,如果我在包含文件 a.txt 的目录中尝试 fn *.txt,那么命令将变为 fn a.txt 而不是 fn *.txt
  • 啊哈......下面的答案解决了这个问题。我在调用时和函数描述中都需要引号。感谢您的快速回复!
  • 如果函数的参数包含通配符,您将始终需要将其引用……但例如,当以fn "*.c" 调用时,编写的函数似乎对我有用。您无法避免在调用 fn 时引用通配符表达式。
  • 我可能会稍微改进您的解决方案。通过将我的函数设为fn() { find . -iname "*$1*" -print},我只需键入fn word,即可在文件名中的任何位置找到所有带有word、Word、WORD、Word 或类似名称的文件。这就是我所追求的,也许你追求不同的东西。

标签: bash function alias wildcard


【解决方案1】:

很遗憾,通配符必须用引号引起来,否则 shell 会尽可能扩展它们。

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

fn '*.txt'
fn Bill\*

【讨论】:

  • 是的,我预料到了。 :( 但我可以忍受。我不知道该怎么做是编写一个别名或函数,我可以将其包含在我的 .bashrc 文件中,这样我只需要输入:fn Bill* 或类似的。
  • 对不起。我的回答很含糊。我不知道如何编写别名或函数,这样我只需要输入: fn "Bill*" (我不介意输入引号;我确实介意必须如此频繁地输入 f i n d - n a m e - p r i n t。感谢您的快速回复,顺便说一句!
  • 我可能遗漏了一些东西,但我尝试直接应用它并没有奏效。我已经编辑了原始帖子以显示我尝试过的功能以及它是如何失败的。
  • 如果您在函数中引用它并且在命令行中引用它,那么您不应该得到您所看到的结果。
【解决方案2】:
find ./ -name "*pbs.e*"  -type f -size +10c

【讨论】:

    猜你喜欢
    • 2022-12-23
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2016-01-13
    • 2022-07-26
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多