【问题标题】:shell script to rename files in folder keeping ordershell脚本重命名文件夹中的文件保持顺序
【发布时间】:2015-10-12 11:39:43
【问题描述】:

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

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 已按字母顺序排序。我想您可以按照上面显示的顺序在脚本中手动列出文件名,而不是 *.txt。一个重要的问题是,为什么你认为name_12.txt 应该变成3.txt(假设你这样做)?
  • name_2 应该在 name_1 之后和 name_13 之前,按字母顺序排序会给出错误的结果...
  • 啊,我明白了。您正在查看 13,我被困在领先的 1 上。您希望对它进行有意义的排序,而不是按字母顺序。我认为man ls 页面可以根据需要进行排序,以构建文件列表(而不是 *.txt)。抱歉,我正在工作,使用的是 Windows 机器,无法为您查找详细信息。

标签: linux bash shell rename


【解决方案1】:

*.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

【讨论】:

  • 谢谢!如何在号码和分机前保留“name_”?
  • @gabboshow 你可以调整你叫它的名字。最简单的方法是将mv "$file" "$(printf "%u" $num).txt" 更改为mv "$file" "name_${num}.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

【讨论】:

    【解决方案3】:

    您可以分两步进行:

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

    【讨论】:

      猜你喜欢
      • 2015-07-13
      • 2015-02-01
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 2014-05-01
      • 2014-08-23
      相关资源
      最近更新 更多