我有多个svg文件...。我需要通过添加1来重命名它们。
0.svg --> 1.svg
1.svg --> 2.svg
2.svg --> 3.svg
等...
使用linux终端执行此操作的最佳方法是什么?
答案 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
shopt -s nullglob
可以防止不良行为。没有它,代码将尝试处理名为“ +([0-9])。svg”的文件。shopt -s extglob
启用了一组比默认样式更丰富的globe模式。有关详细信息,请参见glob - Greg's Wiki中的“ extglob”部分。sparse_basenums
的有效性取决于以下事实:Bash数组可以具有任意的非负整数索引,其索引中带有间隙的数组可以有效地存储(稀疏数组),并且数组中的元素始终被存储以增加索引的顺序。有关更多信息,请参见Arrays (Bash Reference Manual)。mv -i
提示用户输入,并尝试将文件重命名为已经存在的文件。