【问题标题】:Batch rename files by adding +1 to prefix number in a filename通过将 +1 添加到文件名中的前缀编号来批量重命名文件
【发布时间】:2014-06-02 14:32:49
【问题描述】:

所以,我的问题是:如何在文件名中的前缀数字上添加 +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

【问题讨论】:

  • 对于正则表达式,您可能应该匹配行或字符串的开头,而不是使用前瞻,例如^[0-9]*
  • @user3334690 我可能做错了,但似乎没有太大区别。

标签: regex macos terminal batch-processing


【解决方案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" *_*))

【讨论】:

  • 我不确定你希望我如何运行它,所以我这样做了for name in *; do mv -v "$name" "$((${name%%_*}+1))_${name#*_}"; done 奇怪的是,它一直在替换文件,直到文件夹中只有一个文件。
  • 如果您再次运行相同的命令,它将再次增加第一个数字。但是如果目录只有一个文件,它将在重命名第一个文件后停止。
  • 好的,但是我有 12 个文件,运行之后,我有 1 个文件。我猜它的发生是因为它不断重命名同一个文件或其他东西。
  • 您的文件是否按顺序命名,即"1_something", "2_something"
  • 就像我说的我原来的帖子。这里和那里可能存在间隙,数字从 8 跳到 11。但除此之外,每个文件的文件名的其余部分都是相同的。所以是的,问题似乎是文件名是如何相同的,如果你不计算前缀的话。
【解决方案2】:

要在 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

【讨论】:

    猜你喜欢
    • 2021-04-02
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2021-09-08
    • 2013-03-24
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多