AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 497956
Accepted
Jellyse
Jellyse
Asked: 2019-02-01 07:57:40 +0800 CST2019-02-01 07:57:40 +0800 CST 2019-02-01 07:57:40 +0800 CST

用连续数字重命名文件[重复]

  • 772
这个问题在这里已经有了答案:
将文件批量重命名为顺序编号 5 个答案
3年前关闭。

我有大约一千个文件,看起来都像这样:

20091208170014.nc              
20091211150704.nc  
20091214131328.nc  
20091217111953.nc  
20091220092643.nc  
20091223073308.nc  
20091226053932.nc  
20091229034557.nc
20091208171946.nc              
20091211152610.nc

前八位是日期,后六位是连续数字,但这些数字之间的差异在文件之间并不相同。我希望最后六个数字是连续的并且始终使用相同的步骤。例如:

20091208000001.nc              
20091211000002.nc  
20091214000003.nc  
20091217000004.nc  
20091220000005.nc  
20091223000006.nc  
20091226000007.nc  
20091229000008.nc
20091208000009.nc              
20091211000010.nc

我使用https://www.ostechnix.com/how-to-rename-multiple-files-at-once-in-linux/mmv等其他问题检查了该站点上的几个问题,但没有一个可以向我解释如何拥有我名字中的连续数字。

为了将此与问题Batch rename files to a sequence numbering区分开来,顺序排序必须基于最后六位数字,完全忽略前八个字符中的嵌入日期。

rename
  • 2 2 个回答
  • 1741 Views

2 个回答

  • Voted
  1. Jeff Schaller
    2019-02-01T08:09:57+08:002019-02-01T08:09:57+08:00

    在 bash 中,并且没有碰撞检查:

    index=1
    for file in [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].nc
    do
      mv -- "$file" "${file:0:8}"$(printf "%06d" "$index").nc
      ((++index))
    done
    

    通配符[0-9]...选择具有 8+6 (14) 位数字的文件名,后跟.nc. 它遍历所有这些文件并重命名它们。目标文件名由三个部分生成:

    1. "${file:0:8}"-- 现有文件名的前 8 个字符(日期)
    2. $(printf "%06d" "$index")-- 一个 6 位的零填充索引
    3. .nc-- 现有的扩展

    当我在您的示例文件上运行上述循环的“回声”版本时,我得到:

    mv -- 20091208170014.nc 20091208000001.nc
    mv -- 20091208171946.nc 20091208000002.nc
    mv -- 20091211150704.nc 20091211000003.nc
    mv -- 20091211152610.nc 20091211000004.nc
    mv -- 20091214131328.nc 20091214000005.nc
    mv -- 20091217111953.nc 20091217000006.nc
    mv -- 20091220092643.nc 20091220000007.nc
    mv -- 20091223073308.nc 20091223000008.nc
    mv -- 20091226053932.nc 20091226000009.nc
    mv -- 20091229034557.nc 20091229000010.nc
    
    • 1
  2. Best Answer
    roaima
    2019-02-01T08:10:05+08:002019-02-01T08:10:05+08:00

    如果您安装了perl基于- 的rename工具,有时称为prename,您可以在一行中执行此操作,如下所示

    rename -n 's/^(.{8})(.{6})\.(.*)/sprintf "%s%06d.%s", $1, ++$a, $3/e' *.nc
    

    正如所写的,它只会告诉你它会做什么。当您满意时,删除-n以静默运行,或将其替换为-v以查看发生了什么。

    如果您好奇,这将替换三个(..)部分(其中.{n}代表n字符,.*代表任何东西,并且括号创建一个分组),并使用包含第一组和递增的六位数字的格式化打印结果。(不使用第二组。)第三组跨越文件扩展名。

    我应该注意它会拒绝覆盖现有文件。

    样本输出

    20091208170014.nc renamed as 20091208000001.nc
    20091208171946.nc renamed as 20091208000002.nc
    20091211150704.nc renamed as 20091211000003.nc
    20091211152610.nc renamed as 20091211000004.nc
    20091214131328.nc renamed as 20091214000005.nc
    20091217111953.nc renamed as 20091217000006.nc
    20091220092643.nc renamed as 20091220000007.nc
    20091223073308.nc renamed as 20091223000008.nc
    20091226053932.nc renamed as 20091226000009.nc
    20091229034557.nc renamed as 20091229000010.nc
    

    您似乎希望根据文件名的最后六位数字排序,完全忽略嵌入的日期。这里有几个选项。

    1. 如果您的文件足够少,shell 可以完全扩展列表,则对文件进行排序:

      rename -n '..as above..' $(ls -d *.nc | sort -k1.9,1.14n)
      
    2. 执行转换,使排序键暂时放在文件名的前面,然后重命名,然后替换它所属的位置:

      # Swap the first eight and second six groups around
      rename -n 's/^(.{8})(.{6})\.(.*)/$2$1.$3/' *.nc
      
      # Apply the transform with the shell sorting by original sequence
      rename -n 's/^(.{6})(.{8})\.(.*)/sprintf "%06d%s.%s", ++$a, $2, $3/e' *.nc
      
      # Swap back the first six and second eight groups
      rename -n 's/^(.{6})(.{8})\.(.*)/$2$1.$3/' *.nc
      

    和以前一样,删除-n以静默运行或将其替换为-v以查看实际发生的情况。

    • 1

相关问题

  • 如何替换所有文件夹和文件名中的字符串[重复]

  • 如何在某个字符后截断文件名

  • 递归地从文件名中删除字符

  • Krename:如何为每个文件夹重新编号?

  • 根据其中的值批量重命名(附加)CSV 文件

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve