Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 通过添加整数值1重命名多个文件_Bash - Fatal编程技术网

Bash 通过添加整数值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

我有多个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]%.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
有效)。