Eu fiz o download de alguns arquivos epub e preciso convertê-los para epub novamente para que meu leitor de e-books possa lê-los.
Eu posso fazer a conversão em lote com bastante facilidade usando R como abaixo:
setwd("~/Downloads/pubmed")
epub.files = list.files("./",full.names = TRUE,pattern = "epub$")
for (loop in (1:length(epub.files))) {
command = paste("ebook-convert ",
epub.files[loop],
gsub("\.epub",".mod.epub",epub.files[loop]))
system(command)
}
Mas eu não sei como fazer isso usando o linux bash, eu não sei: i) como atribuir uma variável dentro de um for-loop, e ii) como usar a expressão regular para substituir string no bash.
Alguém pode ajudar? Obrigado.
Respostas:
1 para resposta № 1Você também pode usar substituição de parâmetro do bash:
for i in *.epub; do
ebook-convert ${i} ${i/%.epub/.mod.epub}
done
0 para resposta № 2
Você pode usar find
e sed
:
cd ~/Downloads/pubmed
for f in $(find . -regex .*epub$); do
ebook-convert $f $(echo $f | sed "s/.epub/.mod.epub/")
done
0 para resposta № 3
Não sei o que é o ebook-convert, mas se você étentando renomear os arquivos, tente o seguinte. Cole-o em um arquivo com a extensão .sh (para indicar um script de shell) e verifique se ele é executável (chmod + x your-file.sh).
#!/bin/bash
FILES=~/Downloads/pubmed/*.epub
for f in $FILES
do
# $f stores the current file name, =~ is the regex operator
# only rename non-modified epub files
if [[ ! "$f" =~ .mod.epub$ ]]
then
echo "Processing $f file..."
# take action on each file
mv $f "${f%.*}".mod.epub
fi
done
Você precisará do bash versão 3 ou superior para o suporte a regex. Isso pode ser implementado sem a expressão regular também.
0 para a resposta № 4
Você pode usar GNU paralela em combinação com encontrar:
find ~/Downloads/pubmed -name "*.epub" | parallel --gnu ebook-convert {} {.}.mod.epub
Ele deve estar disponível na maioria das distribuições e pode ter vantagens de velocidade sobre um loop comum se você processar um grande número de arquivos. Embora a velocidade não fizesse parte da pergunta original ...