/ / Use a expressão regular no linux bash para alterar o nome do arquivo de saída - regex, linux, r, bash

Use expressão regular no bash do linux para alterar o nome do arquivo de saída - regex, linux, r, bash

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 № 1

Você 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 ...