【问题标题】:Zero-pad numbers in file names that are not padded [duplicate]文件名中未填充的零填充数字[重复]
【发布时间】:2015-11-18 01:54:42
【问题描述】:

我有一个目录,里面全是名为

的文件
image_1.jpg
image_2.jpg
...
image_10.jpg
...
image_335.jpg

现在我想使用一个命令行工具,它希望图像按字母顺序排列。但是这些文件名的字母顺序是:image_100.jpg image_101.jpg ... image_10.jpg image_11.jpg ... image_1.jpg ...

如何使用简短的 shell / bash 命令重命名这些文件?我发现sed 是一种可行的方法,但这个工具对我来说是个谜。

【问题讨论】:

  • 也许您的工具只是使用给定的顺序?例如,如果您将其调用为sometool image*.jpg,那么您可以改为使用sometool image_{1..335}.jpg
  • @thatotherguy 不,该工具只是希望工作目录充满有序图像:(
  • 您在哪个操作系统上执行此操作?你有rename 命令吗?
  • ls -v * 可能是您的朋友,但使用ls 传递文件名总是充满其他问题。

标签: bash shell sed renaming


【解决方案1】:

使用 bash:

for i in *; do if [[ $i =~ (image_)([0-9]{1,2})(\.jpg) ]]; then printf -v num "%03d" "${BASH_REMATCH[2]}"; echo mv -v "$i" "${BASH_REMATCH[1]}${num}${BASH_REMATCH[3]}"; fi; done

如果一切正常,请删除echo

使用具有这些文件名的目录进行测试:

image_100.jpg image_101.jpg image_10.jpg image_11.jpg image_1.jpg image_2.jpg image_334.jpg image_335.jpg image_3.jpg

创建的命令:

mv -v image_10.jpg image_010.jpg mv -v image_11.jpg image_011.jpg mv -v image_1.jpg image_001.jpg mv -v image_2.jpg image_002.jpg mv -v image_3.jpg image_003.jpg

结果:

image_001.jpg image_002.jpg image_003.jpg image_010.jpg image_011.jpg image_100.jpg image_101.jpg image_334.jpg image_335.jpg

【讨论】:

    【解决方案2】:

    好的,我找到了一个解决方案,不是使用 shell 命令,而是编写一个简单的 ruby​​ 脚本:

    input = Dir.glob("image*.jpg")
    
    input.each do |name|
      parts = name.split /[_\.]/
      number = parts[1]
      number = number.rjust(3, '0')
      new_name = [parts[0], '_', number, '.', parts[2]].join
      File.rename(name, new_name)
    end
    

    【讨论】:

      猜你喜欢
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      • 2019-03-15
      • 2011-05-27
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多