find -exec 中的命令替换

Command Substitution in find -exec

我正在尝试使用 find:

pdftotext 提取一堆 pdf 的文本

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

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

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

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

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

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

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

使用 -execdir 而不是 -exec(如果您的 find 实现支持它)。这将使 find 更改为包含该文件的目录,然后使用该目录中的相对文件名调用特定命令。

当然,这种方法会丢失命令行中 any 实例 {} 的完整路径。这包括 pdftotext 生成的文件的目的地。但是,从你的描述来看,这似乎是你想要的。