在Unix中查找别名目录

3
我尝试了以下内容:

我尝试了以下内容:

alias fdi 'find . -type d -iname "*\!^*"' 

但这仅寻找传递的确切名称。 fdi abc 只会输出:
./d/abc

不是这个:

./d/greabcyup

我不仅仅是在寻找精确的名称,还需要显示./d/greabcyup

更新:我已经完成了

echo $0

tcsh


顺便提一下,csh 充满了陷阱。请参阅 http://www.shlomifish.org/open-source/anti/csh/ 以获取更多详细信息。 - Brian Cain
2个回答

2
这是c-shell还是tcsh?
我与O'Reilly Linux in a Nutshell再次核对,!^应该是当前命令行中的第一个单词,所以我认为它没有达到你想要的效果。你可以通过在命令行中使用echo abc def !^来自行验证这个理论(我手头没有csh)。
但很明显,在创建别名时,它没有获取别名的第一个单词(alias)或嵌入在别名中的第一个单词(find)。这可能与csh的评估顺序有关。
通常,大多数Shell(不仅仅是csh)中的任何别名都不能带参数。它将把调用时包含的任何内容追加到末尾。因此,你的别名扩展后,abc参数会作为结果。
find . -type d -iname abc

“你获得的结果支持这一点。(通过将顶部哈希-邦行更改为#!/bin/csh -vx,您可能会看到一些有用的内容,从而打开csh调试。)”
“这就是为什么其他shell具有函数的原因。”
 function fdi() {
     find . -type d -iname "$@"
 }

如果由于策略原因无法使用其他Shell(如Bash、Ksh、Zsh等功能强大的编程语言),并且您经常使用Csh,请确保获取《Unix C shell现场指南》一书,作者是Gail和Paul Anderson。这是一本非常优秀的书籍。
祝您好运。

谢谢...我有其他的shell,但是我个性化了当前的shell,所以现在我使用perl脚本并给它取别名。效果不错。 - user1793023

1
您的别名中的匹配模式"*\!^*"没有被解释为您所期望的那样。 字符序列\!^*是有效的shell历史替换。 换句话说,shell将最后一个星号作为shell历史替换的一部分消耗掉了,并且没有将其传递给“find”命令。 当您运行“fdi abc”时,执行的是
find . -type d -iname "*abc"

最后一个星号已经消失。 您可以通过运行 "fdi abcyup" 来确认,这应该返回。
./d/greabcyup

你可以通过在别名定义中添加另一个星号来修复它。
alias fdi 'find . -type d -iname "*\!^**"' 

问题在于,如果您为别名提供多个参数,则历史替换将消耗所有这些参数。如果您正在寻找名称中带有空格的目录,则可能是您想要的。 但更正确的方法是将历史替换与星号隔离开来,如下所示:
alias fdi 'find . -type d -iname "*\!{^}*"'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接