使用 find 与 exec 和 basename 在找到的文件的目录中执行命令

使用 find 与 exec 和 basename 在找到的文件的目录中执行命令

我有一个包含 MSWord 文件 .doc 的目录树。我想将它们全部转换为 .odt。

语法是:

soffice --headless --convert-to odt -r --outdir <dir to place the .odt> *.doc

我尝试使用它来find一次性完成所有操作。我尝试过以下方法:

find . -name "*.doc" -exec soffice --headless --outdir dirname {} --convert-to odt {} \;

find . -name "*.doc" -exec soffice --headless --outdir $("dirname '{}'") --convert-to odt {} \;

但两次都失败了。我该怎么办?

答案1

改为使用-execdir。它将在包含该文件的同一目录中执行该命令。详细信息记录在man find

find . -name '*.doc' -exec soffice --headless --convert-to odt {} \;

你的第一个示例失败了,因为dirname被解释为 exec 选项的参数。执行的命令将具有dirname作为参数的--outdir文件路径(作为位置参数)soffice --headless --outdir dirname <file> --convert-to odt <file>

在第二个示例中,$("dirname '{}'")由 shell 进行评估,并在执行之前替换输出寻找替换的结果将为空,并且“找不到命令”将打印在标准错误--outdir. 执行的命令根本没有所需的参数soffice --headless --outdir --convert-to odt <file>

相关内容