繁体   English   中英

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 "$1"); pdftotext "$1" ~/Desktop/texts/"${dest%.*}.txt"' _ {}  \;

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

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

当然,这种方法会丢失命令行中任何{}实例的完整路径名。 这包括pdftotext生成的文件的目的地。 但是,根据您的描述,这似乎是您想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM