find -exec找不到本地函数" find:Log:没有这样的文件或目录"

时间:2017-06-08 09:40:57

标签: bash find exec

我有一段代码可以打印特定目录中的所有文件。我使用find exec:

find ${_di} -type f -print -exec Log "$(stat -c%y {}) - {}" \;

其中log是我的函数定义在同一个文件中。 但是id不起作用,我得到错误信息:

  

" find:Log:没有这样的文件或目录"。

为什么呢?这段代码有什么问题?

2 个答案:

答案 0 :(得分:1)

函数不能在-exec中使用,但bash -c可用作命令。 略微修改为使用+作为-exec命令终止符和{}最后允许减少生成的bash进程的数量。

find ${_di} -type f -print -exec bash -c "$(typeset -f Log)"$'\n''for arg; do Log "$(stat -c%y "$arg") - $arg"; done' -- {} +

参数--可以替换为用于shell的$0参数的任何其他内容。

bash -c 'echo $0' hello

也许-printf "%TY-%Tm-%Td %TT - %p\n"选项可以在不启动其他流程的情况下更有效地实现相同的结果。

考虑到以下用例,使用echo可能不如使用find -print选项安全。

touch file.$'\e#8'
find . -type d ! -name . -prune -o -name file'*' -print
find . -type d ! -name . -prune -o -name file'*' -exec echo {} \;

答案 1 :(得分:0)

您需要导出该函数,然后,正如Nahuel所说,在-exec中运行bash:

$ export -f Log

$ find ${_di} -type f -exec bash -c 'Log "$(stat -c%y {}) - {}"' bash \;