有没有办法找到执行我在shell中定义的函数?
例如:
dosomething () {
echo "Doing something with $1"
}
find . -exec dosomething {} \;
其结果是:
find: dosomething: No such file or directory
有没有办法让find's -exec看到做某事?
有没有办法找到执行我在shell中定义的函数?
例如:
dosomething () {
echo "Doing something with $1"
}
find . -exec dosomething {} \;
其结果是:
find: dosomething: No such file or directory
有没有办法让find's -exec看到做某事?
当前回答
不直接,不。Find在一个单独的进程中执行,而不是在您的shell中执行。
创建一个shell脚本,完成与函数相同的工作,并找到can -exec。
其他回答
把函数放在一个单独的文件中,然后get find来执行它。
Shell函数在定义它们的Shell内部;Find永远也看不到他们。
以这种方式执行函数是不可能的。
为了克服这个问题,你可以把你的函数放在一个shell脚本中,然后从find调用它
# dosomething.sh
dosomething () {
echo "doing something with $1"
}
dosomething $1
现在在find as中使用它:
find . -exec dosomething.sh {} \;
find . | while read file; do dosomething "$file"; done
我会完全避免使用-exec。使用xargs:
find . -name <script/command you're searching for> | xargs bash -c
批量处理结果
为了提高效率,许多人使用xargs批量处理结果,但这是非常危险的。因此,在find中引入了另一种方法来批量执行结果。
但是请注意,这种方法可能会带来一些警告,例如POSIX-find中要求在命令末尾使用{}。
export -f dosomething
find . -exec bash -c 'for f; do dosomething "$f"; done' _ {} +
Find会将许多结果作为参数传递给一次bash调用,for循环遍历这些参数,执行函数对每个参数执行一些操作。
上面的解决方案从$1开始参数,这就是为什么有_(代表$0)。
逐一处理结果
同样地,我认为公认的最上面的答案应该更正为
export -f dosomething
find . -exec bash -c 'dosomething "$1"' _ {} \;
这不仅更明智,因为参数应该总是以$1开始,而且如果find返回的文件名对shell具有特殊含义,则使用$0可能会导致意外的行为。