在 find -exec 中使用别名

发布于 2024-12-08 07:37:34 字数 288 浏览 0 评论 0原文

我在 bash 中有一个很长的命令,我不想一直输入它,所以我在 .profile 中放置了一个别名

alias foo='...'

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

find . -exec foo '{}' \;

,但 find 找不到 foo:

查找:foo:没有这样的文件或目录

是否可以在 find 中使用别名?

I have a very long command in bash, which I do not want to type all the time, so I put an alias in my .profile

alias foo='...'

Now I want to execute this alias using find -exec

find . -exec foo '{}' \;

but find cannot find foo:

find: foo: No such file or directory

Is it possible to use an alias in find?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

不回头走下去 2024-12-15 07:37:34

find 本身并不知道有关别名的任何信息,但您的 shell 知道。如果您使用的是足够新的 bash 版本(我认为 4.0 添加了此功能),您可以使用 find 。 -exec ${BASH_ALIASES[foo]} {} \; 在命令行中的该位置插入别名的文字内容。

find itself doesn't know anything about aliases, but your shell does. If you are using a recent enough version of bash (I think 4.0 added this feature), you can use find . -exec ${BASH_ALIASES[foo]} {} \; to insert the literal content of the alias at that point in the command line.

时常饿 2024-12-15 07:37:34

不, find 对您的别名一无所知。别名与环境变量不同,因为它们不会被子进程“继承”。

您可以使用相同的命令创建一个 shell 脚本,设置 +x 权限并将其放在您的路径中。这将与 find 一起使用。

Nope, find doesn't know anything about your aliases. Aliases are not like environment variables in that they aren't "inherited" by child processes.

You can create a shell script with the same commands, set +x permissions and have it in your path. This will work with find.

酷炫老祖宗 2024-12-15 07:37:34

在处理 find 结果时调用别名的另一种方法是使用类似 这个答案

因此以下内容应该有效:

alias ll="ls -al"
find . -type d | while read folder; do ll $folder; done

Another way of calling an alias when processing the results of find is to use something like this answer

so the following should work:

alias ll="ls -al"
find . -type d | while read folder; do ll $folder; done
栖迟 2024-12-15 07:37:34

在本示例中,我使用的是众所周知的 ll 别名,但您也可以使用自己的别名,只需将以下行中的 ll 替换为您的别名 (foo) 并且它应该可以工作:

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

您的情况:

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

请注意,它假设使用以下语法引用您的别名:

alias foo='your-very-long-command'

I am using the ll commonly know alias for this example but you may use your alias instead, just replace ll in the following line with your alias (foo) and it should work:

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

your case:

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

Note it assumes your alias is quoted using the following syntax:

alias foo='your-very-long-command'
小耗子 2024-12-15 07:37:34

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

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

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

It's not possible (or difficult / error-prone) to use aliases in the find command.
An easier way to achieve the desired result is putting the contents of the alias in a shellscript and run that shellscript:

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

The sed command removes the leading alias foo=' and replaces the trailing ' by "$@" which will contain the arguments passed to the script.

帥小哥 2024-12-15 07:37:34

您可以使用该变量来代替。

因此,不要

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 {}" \;

You can use the variable instead.

So instead of:

alias foo="echo test"

use:

foo="echo test"

then execute it either by command substitution or eval, for instance:

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

or:

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

Here is real example which is finding all non-binary files:

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 {}" \;
所有深爱都是秘密 2024-12-15 07:37:34

我遇到了同样的事情并且几乎实现了 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'

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

无论如何,长话短说,我可以更快地编辑任意脚本文件:
$ fvim foo.groovy

I ran into the same thing and pretty much implemented skjaidev's solution.

I created a bash script called findVim.sh with the following contents:

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

Then I added the the .bashrc alias as:

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

Finally, I reloaded .bashrc with source ~/.bashrc.

Anyways long story short I can edit arbitrary script files slightly faster with:
$ fvim foo.groovy

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文