shell 用于重命名文件夹中的文件以保持顺序的脚本

shell script to rename files in folder keeping order

在一个文件夹中我有几个文件,例如

name_1.txt
name_2.txt
name_12.txt
name_13.txt

我想在

中重命名它们
name_1.txt -> name_1.txt
name_2.txt -> name_2.txt
name_12.txt -> name_3.txt
name_13.txt -> name_4.txt

以下代码完成了部分工作,但不保持顺序

#!/bin/sh
num=1
for file in *.txt; do
       mv "$file" "$(printf "%u" $num).txt"
       let num=$num+1
done

确实输出是

name_1.txt -> 1.txt
name_2.txt -> 4.txt
name_12.txt -> 2.txt
name_13.txt -> 3.txt

如何确定名称和顺序?谢谢!

*.txt 扩展为 name_12.txt name_13.txt name_1.txt name_2.txt 因为这对计算机来说最有意义。您需要对此进行排序,然后才能以我们人性化的方式开始。 ls 命令可以很好地使用自然排序 ls -v *.txt.

这意味着代码需要看起来像这样...

#!/bin/sh
num=1
for file in $(ls -v *.txt); do
   mv "$file" "$(printf "%u" $num).txt"
   let num=$num+1
done

您可以分两步进行:

  1. 重命名所有数字长度相同的文件:

    for file in name_?.txt ; do
        if [[ -f ${file/_/_0} ]] ; then
            echo "Can't rename $file: ${file/_/_0} already exists." >&2
            exit 1
        fi
        mv "$file" "${file/_/_0}"
    done
    

    这会将 name_1.txt 重命名为 name_01.txt

    您也可以使用 rename,但是有许多版本具有不同的语法,例如

    rename _ _0 rename_?.txt
    # or
    rename 's/_/_0/' rename_?.txt
    
  2. 现在您可以使用您已经尝试过的方法了。

在代码中添加 sort -n

#!/bin/sh
num=1
for file in $(ls *.txt | sort -n) do
   mv "$file" "$(printf "%u" $num).txt"
   let num=$num+1
done