Bash 通过添加整数值1重命名多个文件
我有多个svg文件…我需要通过添加1来重命名它们Bash 通过添加整数值1重命名多个文件,bash,Bash,我有多个svg文件…我需要通过添加1来重命名它们 0.svg --> 1.svg 1.svg --> 2.svg 2.svg --> 3.svg 等等 使用linux终端执行此操作的最佳方法是什么?诀窍是向后处理文件,以便在重命名时不会覆盖现有文件。使用参数展开从文件名中提取数字 #!/bin/bash files=(?.svg) for (( i = ${#files[@]} - 1; i >= 0; --i )) ; do n=${files[i
0.svg --> 1.svg
1.svg --> 2.svg
2.svg --> 3.svg
等等
使用linux终端执行此操作的最佳方法是什么?诀窍是向后处理文件,以便在重命名时不会覆盖现有文件。使用参数展开从文件名中提取数字
#!/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
),解决方案将更加复杂,因为您需要对文件进行数字排序,而不是按字典排序。考虑到文件名编号有多个数字,请尝试以下方法:
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
)
而IFS=read-r num;做
new=“$((num+1)).svg”
mv--“$num.svg”“$new”
完成<此-清除代码旨在安全、干净地运行,无论当前目录中有什么:
#! /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
防止在目录中不包含任何名称为十进制数后跟“.svg”的文件时出现不良行为。如果没有它,代码将尝试处理名为“+([0-9]).svg”的文件
shopt-s extglob
支持比默认模式更丰富的全局模式集。有关详细信息,请参阅中的“extglob”部分
sparse_basenums
的有用性取决于这样一个事实:Bash数组可以具有任意非负整数索引,索引中有间隙的数组可以有效地存储(稀疏数组),数组中的元素总是按索引增加的顺序存储。有关更多信息,请参阅
- 该代码跳过名称中有额外前导零('09.svg',但没有'0.svg')的文件,因为它无法像现在这样安全地处理它们。试图将“09”视为数字会导致错误,因为它被视为非法的八进制数。这很容易解决,但如果您同时拥有'9.svg'和'09.svg'(它们自然都会被重命名为'10.svg'),则仍然可能存在问题
- 代码使用
mv-i
提示用户输入,以防出现错误,并尝试将文件重命名为已存在的文件
- 请注意,如果数字太大(例如“9999999999999999999.svg”),代码将自动执行错误操作(由于算术溢出)。这个问题是可以解决的
它们必须保持相同的顺序,还是您可以简单地将0.svg
重命名为最后一个位置?Eric,我想我不明白您的问题。最后一个位置是什么意思?如果您有名为0.svg
、1.svg
和2.svg
的文件,获取名为1.svg
、2.svg
和3.svg
的文件的最简单方法是将0.svg
重命名为3.svg
。这在OP的情况下可能有效,但是,如果目录没有“.svg”文件,如果svg文件基不是十进制数,或者(可能)如果基有前导零,则会出错。所有以标识符为基址的文件(例如,“image.svg”将以静默方式重命名为“1.svg”,因为Bash算术将未设置的变量视为值为零(除非set-o nounset
有效)。