【问题标题】:Script for changing the sequence number on a file name用于更改文件名上的序列号的脚本
【发布时间】:2010-12-05 08:57:51
【问题描述】:

我正在编写一个 shell 脚本,但我被卡住了。要求是:我将收到带有序列号的文件,例如 xyz0001abcd.DAT。我创建了该文件的副本,将序列号保留为 abcd000001gfh.DAT。原始文件名使用四位数(最多 9999),复制的文件名使用六位数(最多 999999)。

当 9999 出现在原始文件中时,我被卡住了。原始文件序列号将环绕,但我希望复制的文件序列号继续。即映射9999->009999后,我会再次收到0001,并将其映射到10000,这样复制的文件就可以继续编号直到999999。

xyz0001abcd.DAT -> abcd000001gfh.DAT
xyz0002abcd.DAT -> abcd000002gfh.DAT
.
.
.
xyz9999abcd.DAT -> abcd009999gfh.DAT   # First sequence wraps around.
xyz0001abcd.DAT -> abcd010000gfh.DAT
xyz0002abcd.DAT -> abcd010001gfh.DAT

这如何以 shell 脚本的形式完成?

【问题讨论】:

  • 好吧!!这是一个现有的脚本,它作为守护进程运行,持续监视文件并创建文件的副本。但它直接按原样放置序列号。所以我需要更改进程的行为。
  • 如果您将 0001 映射到 10001,或者跳过 10000 或在原始文件编号中包含 0000,这会更漂亮。 mouviciel 的回答跳过了 10000,让您使用字符串前缀而不是模运算。

标签: unix shell scripting sed awk


【解决方案1】:

您可以通过以下方式获取原始文件的序列号:

echo $myFileName | sed 's/^[^0-9]*\(....\).*$/\1/'

您可以获得以原始文件命名的所有现有重复文件的列表,但您需要使用两位数前缀:

printf "%s\n" ` `echo $myFileName | sed "s/\([0-9]\)/??\1/" `

您可以通过以下方式获取重复文件的两位数前缀:

echo $myDupFileName | sed 's/^[^0-9]*\(..\).*$/\1/'

通过结合前面的两个命令,以原始文件命名的所有重复文件的最大两位数前缀:

printf "%s\n" ` `echo $myFileName | sed "s/\([0-9]\)/??\1/" ` \
| tail -1 \
| sed 's/^[^0-9]*\(..\).*$/\1/'

我作为练习离开:

  • 这个最大前缀的递增,
  • 在不存在重复的情况下测试案例,
  • 根据已收集的所有信息建立一个新名称。

【讨论】:

  • 嗯,这可以帮助我一点。但目的仍然没有解决,我必须循环 99 次,因为还有 99 个循环。比如 0001-9999 被认为是一个循环,下一次重新开始 0001 被认为是第二个循环。
  • 我的假设是您可以通过观察现有重复文件的文件名来识别循环,这些文件名与该循环编号。
猜你喜欢
  • 1970-01-01
  • 2014-07-29
  • 2015-06-08
  • 1970-01-01
  • 2015-08-06
  • 2022-12-07
  • 1970-01-01
  • 2012-11-14
  • 2012-03-24
相关资源
最近更新 更多