我有一段代码可以打印特定目录中的所有文件。我使用find exec:
find ${_di} -type f -print -exec Log "$(stat -c%y {}) - {}" \;
其中log是我的函数定义在同一个文件中。 但是id不起作用,我得到错误信息:
" find:Log:没有这样的文件或目录"。
为什么呢?这段代码有什么问题?
答案 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 \;