【发布时间】: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