find -exec 中的命令替换

qua*_*asi 2 linux bash shell posix find

我正在尝试pdftotext使用 find提取一堆 pdf 的文本:

find /path/to/pdfs -iname "*.pdf" -exec pdftotext {} ~/Desktop/texts/{} \;

但是这不起作用,因为{}包含完整路径(并且路径可以不同)。所以我尝试使用basename,但是似乎没有被find.

find /path/to/pdfs -iname "*.pdf" -exec pdftotext {} ~/Desktop/texts/$(basename {}) \;

我还尝试了反引号和引用整件事的各种方式。似乎没有任何效果。

M. *_*din 6

您的方法不起作用,因为$(basename {})是在find调用之前执行的(在调用命令之前评估参数中的外壳扩展)。find像这样使用:

find /path/to/pdfs -iname "*.pdf" -exec bash -c \
'dest=$(basename "$1"); pdftotext "$1" ~/Desktop/texts/"${dest%.*}.txt"' _ {}  \;
Run Code Online (Sandbox Code Playgroud)

请注意,如果搜索目录中存在具有相同基本名称的 pdf 文件,则某些目标文件可能会被覆盖。