我在bash中有一个非常长的命令,我不想一遍遍地敲入它,所以我在我的.profile文件中设置了一个别名。
alias foo='...'
现在我想使用find -exec执行这个别名
find . -exec foo '{}' \;
但是find无法找到foo:
find:foo:没有那个文件或目录
在find命令中使用别名是否可行?
find
本身对别名一无所知,但你的shell知道。如果你使用的是足够新的bash
版本(我认为4.0添加了此功能),你可以使用find . -exec ${BASH_ALIASES[foo]} {} \;
在命令行中的该点插入别名的文字内容。
不,find命令对你的别名一无所知。别名不像环境变量那样被子进程“继承”。
你可以创建一个包含相同命令的shell脚本,并赋予它+ x权限,并将其放在你的路径中。这将与find命令一起使用。
alias ll="ls -al"
find . -type d | while read folder; do ll $folder; done
我在此例中使用常见的别名ll
,但你可以使用自己的别名,只需将以下行中的ll
替换为你的别名(foo
)即可:
find . -exec `alias ll | cut -d"'" -f2` {} \;
您的情况:
find . -exec `alias foo | cut -d"'" -f2` {} \;
alias foo='your-very-long-command'
在find
命令中使用别名是不可能的(或者说很困难/容易出错)。
实现所需的结果更简单的方法是将别名的内容放入一个shell脚本中并运行该脚本:
alias foo | sed "s/alias foo='//;s/'$/ \"\$@\"/" > /tmp/foo
find -exec bash /tmp/foo {} \;
sed 命令会删除前导的 alias foo='
并将尾随的 '
替换为 "$@"
,其中包含传递给脚本的参数。
我遇到了同样的问题,基本上实现了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
你可以使用变量代替。
因此,不要写成:
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 {}" \;