usando find com exec e basename para executar um comando no diretório do arquivo encontrado

0

Eu tenho uma árvore de diretórios que contém arquivos do MSWord .doc. Eu quero converter todos para .odt.

A sintaxe é:

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

Estou tentando usá-lo com find para fazer tudo de uma vez. Eu tentei seguir:

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

e

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

Mas ambos falham. Como posso fazer isso?

    
por Fernando 09.09.2017 / 15:36

1 resposta

1

Use -execdir . Ele irá executar o comando no mesmo diretório que contém o arquivo. Os detalhes estão documentados em man find .

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

Seu primeiro exemplo falhou porque dirname foi interpretado como um argumento para a opção exec. O comando executado teria dirname como o argumento para --outdir e teria o caminho do arquivo depois dele (como argumento posicional) soffice --headless --outdir dirname <file> --convert-to odt <file>

No segundo exemplo $("dirname '{}'") é avaliado pelo shell e a saída é substituída antes de executar find . O resultado da substituição seria vazio e "comando não encontrado" seria impresso em stderr . O comando executado não teria o parâmetro necessário para --outdir em soffice --headless --outdir --convert-to odt <file>

    
por 09.09.2017 / 15:47