通过在文件名中添加+1到前缀号来批量重命名文件

时间:2014-06-02 14:32:49

标签: regex macos terminal batch-processing

所以,我的问题是:如何在文件名中为前缀号添加+1?

目标是重命名多个文件,以便它们可以从中获取:

1_loremipsum_and_stuff_2013.pdf
2_loremipsum_and_stuff_2013.pdf
3_loremipsum_and_stuff_2013.pdf
4_loremipsum_and_stuff_2013.pdf
13_loremipsum_and_stuff_2013.pdf
18_loremipsum_and_stuff_2013.pdf
19_loremipsum_and_stuff_2013.pdf
20_loremipsum_and_stuff_2013.pdf

对此:

2_loremipsum_and_stuff_2013.pdf
3_loremipsum_and_stuff_2013.pdf
4_loremipsum_and_stuff_2013.pdf
5_loremipsum_and_stuff_2013.pdf
14_loremipsum_and_stuff_2013.pdf
19_loremipsum_and_stuff_2013.pdf
20_loremipsum_and_stuff_2013.pdf
21_loremipsum_and_stuff_2013.pdf


我根本不熟悉终端。我找到了examples for removing prefix number。它工作正常,但是当我尝试使用正则表达式替换某些东西时,我无法接近它。

因此,在第一次尝试并且在终端中正确地重新尝试这种情况之后,我认为我会在javascript中试一试。

我能够得到它 working in javascript /[0-9]*(?=_)/

所以,我对终端的最佳猜测是这个,除非它不起作用。:

cd  {TESTFOLDER}

REGEX=[0-9]*(?=_)

for name in *; do mv -v "$name" "${name/$REGEX/$(( ${name/$REGEX}+1 ))}"; done

2 个答案:

答案 0 :(得分:1)

使用BASH字符串操作:

s='1_loremipsum_and_stuff_2013.pdf'
mv "$s" "$((${s%%_*}+1))_${s#*_}"

编辑:根据以下讨论,您可以使用

while read f; do 
   mv "$f" "$((${f%%_*}+1))_${f#*_}"
done < <(sort -t_ -rnk1,2 <(printf "%s\n" *_*))

答案 1 :(得分:0)

要在bash中执行确切的示例-只需

for f in *.pdf; 
  do \
  echo mv "$f" "$((${f%%_*}+1))_${f#*_}"; # remove echo for real run
done

但是,很多人在整数之间可能会有字母前缀,例如SQL迁移文件。示例:V1__some_awesome_migration.sql

在这种情况下,您将需要在要增加的整数之前修剪前缀。为此,您可以将修剪后的字符串分配给变量,例如:

for f in *.pdf; 
  do  \
  prefix="${f:0:1}"
  suffix="${f:1}"; 
  echo mv "$f" "$prefix$((${suffix%%_*}+1))_${suffix#*_}"; # remove echo for real run
done