有没有办法找到执行我在shell中定义的函数?

例如:

dosomething () {
  echo "Doing something with $1"
}
find . -exec dosomething {} \;

其结果是:

find: dosomething: No such file or directory

有没有办法让find's -exec看到做某事?


当前回答

Jac的回答很好,但它有几个容易克服的陷阱:

find . -print0 | while IFS= read -r -d '' file; do dosomething "$file"; done

这将使用null作为分隔符而不是换行符,因此具有换行符的文件名将正常工作。它还使用-r标志来禁用反斜杠转义,如果没有它,文件名中的反斜杠将不起作用。它还清除IFS,以便名称中潜在的尾随空白不会被丢弃。

其他回答

让脚本调用自身,将找到的每个项作为参数传递:

#!/bin/bash

if [ ! $1 == "" ] ; then
   echo "doing something with $1"
   exit 0
fi

find . -exec $0 {} \;

exit 0

当您单独运行脚本时,它会找到您正在寻找的内容,并调用自己,将每个查找结果作为参数传递。当脚本使用参数运行时,它会执行参数上的命令,然后退出。

我会完全避免使用-exec。使用xargs:

find . -name <script/command you're searching for> | xargs bash -c

因为只有shell知道如何运行shell函数,所以必须运行shell才能运行函数。你还需要用export -f标记你的export函数,否则子shell不会继承它们:

export -f dosomething
find . -exec bash -c 'dosomething "$0"' {} \;

不直接,不。Find在一个单独的进程中执行,而不是在您的shell中执行。

创建一个shell脚本,完成与函数相同的工作,并找到can -exec。

把函数放在一个单独的文件中,然后get find来执行它。

Shell函数在定义它们的Shell内部;Find永远也看不到他们。