У меня есть дерево каталогов, которое содержит файлы 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 ответ1

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 '{}'") оценивается оболочкой и вывод выполняется перед выполнением поиска. Результат подстановки будет пустым, а "команда не найдена" будет напечатана в stderr. Выполняемая команда вообще не будет иметь обязательного параметра для --outdir soffice --headless --outdir --convert-to odt <file>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .