有没有办法找到执行我在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看到做某事?
当前回答
以这种方式执行函数是不可能的。
为了克服这个问题,你可以把你的函数放在一个shell脚本中,然后从find调用它
# dosomething.sh
dosomething () {
echo "doing something with $1"
}
dosomething $1
现在在find as中使用它:
find . -exec dosomething.sh {} \;
其他回答
Jac的回答很好,但它有几个容易克服的陷阱:
find . -print0 | while IFS= read -r -d '' file; do dosomething "$file"; done
这将使用null作为分隔符而不是换行符,因此具有换行符的文件名将正常工作。它还使用-r标志来禁用反斜杠转义,如果没有它,文件名中的反斜杠将不起作用。它还清除IFS,以便名称中潜在的尾随空白不会被丢弃。
我会完全避免使用-exec。使用xargs:
find . -name <script/command you're searching for> | xargs bash -c
把函数放在一个单独的文件中,然后get find来执行它。
Shell函数在定义它们的Shell内部;Find永远也看不到他们。
只是一个关于使用shell的接受答案的警告, 尽管它很好地回答了这个问题,但它可能不是在查找结果上执行某些代码的最有效方式:
这里是bash下的所有解决方案的基准测试, 包括一个简单的for循环的情况: (1465个目录,在一个标准硬盘驱动器上,armv7l GNU/Linux synology_armada38x_ds218j)
dosomething() { echo $1; }
export -f dosomething
time find . -type d -exec bash -c 'dosomething "$0"' {} \;
real 0m16.102s
time while read -d '' filename; do dosomething "${filename}" </dev/null; done < <(find . -type d -print0)
real 0m0.364s
time find . -type d | while read file; do dosomething "$file"; done
real 0m0.340s
time for dir in $(find . -type d); do dosomething $dir; done
real 0m0.337s
“find | while”和“for loop”似乎在速度上最好且相似。
以这种方式执行函数是不可能的。
为了克服这个问题,你可以把你的函数放在一个shell脚本中,然后从find调用它
# dosomething.sh
dosomething () {
echo "doing something with $1"
}
dosomething $1
现在在find as中使用它:
find . -exec dosomething.sh {} \;