在find -exec中使用别名

26

我在bash中有一个非常长的命令,我不想一遍遍地敲入它,所以我在我的.profile文件中设置了一个别名。

alias foo='...'

现在我想使用find -exec执行这个别名

find . -exec foo '{}' \;

但是find无法找到foo:

find:foo:没有那个文件或目录

在find命令中使用别名是否可行?

7个回答

19

find本身对别名一无所知,但你的shell知道。如果你使用的是足够新的bash版本(我认为4.0添加了此功能),你可以使用find . -exec ${BASH_ALIASES[foo]} {} \;在命令行中的该点插入别名的文字内容。


12

不,find命令对你的别名一无所知。别名不像环境变量那样被子进程“继承”。

你可以创建一个包含相同命令的shell脚本,并赋予它+ x权限,并将其放在你的路径中。这将与find命令一起使用。


7
处理find命令结果时,另一种调用别名的方法是使用类似这个答案的方式。因此,以下内容应该有效:
alias ll="ls -al"
find . -type d | while read folder; do ll $folder; done

2

我在此例中使用常见的别名ll,但你可以使用自己的别名,只需将以下行中的ll替换为你的别名(foo)即可:

find . -exec `alias ll | cut -d"'" -f2` {} \;

您的情况:

find . -exec `alias foo | cut -d"'" -f2` {} \;

请注意,以下内容假定您的别名是使用以下语法引用的:
alias foo='your-very-long-command'

0

find命令中使用别名是不可能的(或者说很困难/容易出错)。 实现所需的结果更简单的方法是将别名的内容放入一个shell脚本中并运行该脚本:

alias foo | sed "s/alias foo='//;s/'$/ \"\$@\"/" > /tmp/foo
find -exec bash /tmp/foo {} \;

sed 命令会删除前导的 alias foo=' 并将尾随的 ' 替换为 "$@",其中包含传递给脚本的参数。


0

我遇到了同样的问题,基本上实现了skjaidev的解决方案。

我创建了一个名为findVim.sh的bash脚本,其内容如下:

[ roach@sepsis:~ ]$ cat findVim.sh                                                                                                        #!/bin/bash                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
find . -iname $1 -exec vim '{}' \;

然后我将.bashrc别名添加为:

[ roach@sepsis:~ ]$ cat ~/.bashrc | grep fvim                                                                                         
alias fvim='sh ~/findVim.sh'

最后,我使用 source ~/.bashrc 重新加载了 .bashrc 文件。

总之,我可以通过以下方式更快地编辑任意脚本文件: $ fvim foo.groovy


0

你可以使用变量代替。

因此,不要写成:

alias foo="echo test"

使用:

foo="echo test"

然后通过命令替换或eval执行它,例如:

find . -type f -exec sh -c "eval $foo" \;

或者:

find . -type f -exec sh -c "echo `$foo`" \;

这里有一个真实的例子,它可以找到所有非二进制文件:

IS_BINARY='import sys; sys.exit(not b"\x00" in open(sys.argv[1], "rb").read())'
find . -type f -exec bash -c "python -c '$IS_BINARY' {} || echo {}" \;

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