Vou expandir em resposta do jasonwryan , que explica o que, mas não o como ou o porquê.
Você pode usar a saída de um comando como argumentos para outro comando. Isso é chamado de substituição de comando .
some_text='Hello, world'
uppercased="$(echo "$some_text" | tr a-z A-Z)"
echo "Now, it's $uppercased"
No entanto, é horrível por dois motivos: $(ls …)
- Não analise a saída de ls . Não foi projetado para ser analisável.
-
"$(some-command)"
fornece uma string, que é a saída desse comando. Se você tiver um comando que retorne uma lista de elementos, será necessário analisar essa sequência em elementos individuais. Isso é complicado e não confiável, a menos que você possa encontrar um separador simples. Para nomes de arquivos, você não pode encontrar facilmente um separador, porque os nomes de arquivos na maioria dos unices podem conter todos os caracteres⁰.
Observe que, se você escrever $(some-command)
em vez de "$(some-command)"
, a saída do comando será dividida em palavras e passará por globbing. Até que você entenda a sentença anterior, sempre coloque aspas duplas em torno das substituições de comandos. Quando você entende, sempre coloque aspas duplas, a menos que você saiba por que não pode colocá-las.
Felizmente, gerar a lista de arquivos que correspondem a um determinado padrão é um recurso integrado ao shell. Chama-se globbing .
echo *.pdf
Para atuar em vários arquivos, você usa um loop.
for x in *.pdf; do …; done
O obstáculo restante é gerar o nome do arquivo de destino. O shell possui alguns comandos simples de manipulação de texto, entre os quais ${foo%SUFFIX}
para obter o valor de uma variável com um sufixo removido. (Também há ${foo#PREFIX}
.)
for x in *.pdf; do
ebook-convert "$x" "${x%.pdf}.epub"
done
Observe as aspas duplas em torno das substituições de variáveis. A razão é a mesma das substituições de comandos.
⁰ Exceto um caractere nulo, mas a maioria das conchas não consegue lidar com isso.