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

时间:2015-07-22 14:18:50

标签: linux bash shell rename

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

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

如何修改名称和订单?谢谢!

3 个答案:

答案 0 :(得分:2)

*.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 :(得分:0)

您可以分两步进行:

  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. 现在您可以使用已经尝试过的方法。

答案 2 :(得分:0)

将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