在find -exec中使用命令替换

问题描述

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

pdftotext

但是,这不起作用,因为find /path/to/pdfs -iname "*.pdf" -exec pdftotext {} ~/Desktop/texts/{} \;包含完整路径(并且路径可以不同)。所以我尝试使用{},但是basename似乎并没有执行它。

find

我还尝试了反引号和引用整件事的各种方式。似乎什么都没有。

解决方法

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

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

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

,

使用-execdir代替-exec(如果您的find实现支持)。这将使find切换到包含文件的目录,然后使用该目录中的相对文件名来调用特定命令。

当然,此方法将从命令行中{}任何实例中丢失全部路径。其中包括pdftotext生成的文件的目的地。但是,从您的描述来看,这似乎仍然是您想要的。