在linux bash中使用正则表达式来更改输出文件名

时间:2014-08-27 15:08:05

标签: regex linux r bash

我已经下载了一些epub文件,我需要再次将它们转换为epub,以便我的电子书阅读器可以阅读它们。

我可以使用R轻松地批量转换,如下所示:

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)
}

但我不知道如何使用linux bash,我不知道:i)如何在for循环中分配变量,以及ii)如何使用正则表达式替换bash中的字符串。

有人可以帮忙吗?感谢。

4 个答案:

答案 0 :(得分:2)

您还可以使用bash's parameter substitution

for i in *.epub; do 
    ebook-convert ${i} ${i/%.epub/.mod.epub}
done

答案 1 :(得分:0)

您可以使用findsed

cd ~/Downloads/pubmed
for f in $(find . -regex .*epub\$); do
  ebook-convert $f $(echo $f | sed 's/\.epub/.mod.epub/')
done

答案 2 :(得分:0)

不确定电子书转换是什么,但如果您尝试重命名文件,请尝试以下操作。将其粘贴到扩展名为.sh的文件中(表示shell脚本),并确保它是可执行文件(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

您需要bash版本3或更高版本才能获得正则表达式支持。这也可以用正则表达式实现。

答案 3 :(得分:0)

您可以将GNU parallel与find结合使用:

find ~/Downloads/pubmed -name '*.epub' | parallel --gnu ebook-convert {} {.}.mod.epub

它应该在大多数发行版上都可用,如果处理大量文件,它可能比普通循环具有速度优势。虽然速度不是原始问题的一部分......