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
生成的文件的目的地。但是,从你的描述来看,这似乎是你想要的。
我正在尝试使用 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
生成的文件的目的地。但是,从你的描述来看,这似乎是你想要的。