对目录中的每个文件执行命令

问题描述 投票:0回答:1

我需要将一系列图像从一种格式转换为另一种格式。但我需要删除扩展名或后缀,以便将其传递给管道中的另一个软件。我正在尝试使用以下命令

find . -type f -iname "*.pdf" -exec convert {} $(basename {} .pdf).png \;

目的是保留

*.pdf
文件,并拥有新的
*.png
文件。然而,生成的文件最终的扩展名是
.pdf.png

据我了解,

$(basename {} .pdf)
是在
find
命令之前执行的,导致文字
{}
,这就是为什么convert的输出是
{}.png

我应该添加

"`´'
的任何特定组合,还是明确调用
sh -c
使这个工作?

我使用 zsh 作为我的 shell

如有任何帮助,我们将不胜感激

find zsh exec basename
1个回答
0
投票

使用

find

find . -type f -iname "*.pdf" -exec zsh -c 'convert $1 ${1:r}.png' _ {} \;

使用 shell 循环(与

find
不同,这不会为每个文件启动子 shell):

setopt extendedglob
for fl in (#i)**/*.pdf; do
    convert $fl ${fl:r}.png
done

使用

zmv
(更紧凑):

autoload zmv
zmv -p convert '(#i)**/*.pdf' '${f:r}.png'
© www.soinside.com 2019 - 2024. All rights reserved.