通过添加整数值1重命名多个文件

时间:2019-05-20 23:03:14

标签: bash

我有多个svg文件...。我需要通过添加1来重命名它们。

0.svg  -->  1.svg
1.svg  -->  2.svg
2.svg  -->  3.svg

等...

使用linux终端执行此操作的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

诀窍是向后处理文件,以便您在重命名时不会覆盖现有文件。使用参数扩展从文件名中提取数字。

#!/bin/bash
files=(?.svg)
for (( i = ${#files[@]} - 1; i >= 0; --i )) ; do
    n=${files[i]%.svg}
    mv $n.svg $(( n + 1 )).svg
done

如果文件可以使用不同长度的名称(例如9.svg, 10.svg),则解决方案将更加复杂,因为您需要按数字而不是按字典顺序对文件进行排序。

答案 1 :(得分:1)

考虑到文件名编号具有多个数字的情况,请尝试以下操作:

while IFS= read -r num; do
    new="$(( num + 1 )).svg"
    mv -- "$num.svg" "$new"
done < <(
for f in *.svg; do
    n=${f%.svg}
    echo "$n"
done | sort -rn
)

答案 2 :(得分:0)

Shellcheck干净的代码旨在安全和干净地运行,而不管当前目录中的内容如何:

#! /bin/bash -p

shopt -s nullglob   # Globs that match nothing expand to nothing
shopt -s extglob    # Enable extended globbing (+(...), ...)

# Put the file base numbers in a sparse array.
# (Bash automatically keeps such arrays sorted by increasing indices.)
sparse_basenums=()
for svgfile in +([0-9]).svg ; do
    # Skip files with extra leading zeros (e.g. '09.svg')
    [[ $svgfile == 0[0-9]*.svg ]] && continue

    basenum=${svgfile%.svg}
    sparse_basenums[$basenum]=$basenum
done

# Convert the sparse array to a non-sparse array (preserving order)
# so it can be processed in reverse order with a 'for' loop
basenums=( "${sparse_basenums[@]}" )

# Process the files in reverse (i.e. decreasing) order by base number
for ((i=${#basenums[*]}-1; i>=0; i--)) ; do
    basenum=${basenums[i]}
    mv -i -- "$basenum.svg" "$((basenum+1)).svg"
done
    如果目录不包含名称为十进制数字后跟“ .svg”的任何文件,
  • shopt -s nullglob可以防止不良行为。没有它,代码将尝试处理名为“ +([0-9])。svg”的文件。
  • shopt -s extglob启用了一组比默认样式更丰富的globe模式。有关详细信息,请参见glob - Greg's Wiki中的“ extglob”部分。
  • sparse_basenums的有效性取决于以下事实:Bash数组可以具有任意的非负整数索引,其索引中带有间隙的数组可以有效地存储(稀疏数组),并且数组中的元素始终被存储以增加索引的顺序。有关更多信息,请参见Arrays (Bash Reference Manual)
  • 该代码会跳过名称带有额外的前导零(“ 09.svg”而不是“ 0.svg”)的文件,因为它无法像现在一样安全地处理它们。尝试将'09'视为数字会导致错误,因为它被视为非法的八进制数字。这很容易解决,但是例如,如果您同时拥有“ 9.svg”和“ 09.svg”(它们自然会重命名为“ 10.svg”),仍然可能会出现问题。 )。
  • 如果出现问题,该代码使用mv -i提示用户输入,并尝试将文件重命名为已经存在的文件。
  • 请注意,如果数字太大(例如'99999999999999999999.svg'),则代码(由于算术溢出)将无提示地执行错误的操作。这个问题可以解决。