重命名多个文件;追加

重命名多个文件;追加

我希望重命名具有相同名称的多个文件,但文件名末尾除外。我想用增量计数器替换不同的部分。例如,使用以下文件,

71116_123    71116_134    71116_113    71116_023
71116_923    71116_103    71116_125    71116_223

我想将它们重命名为

71116_1    71116_2    71116_3    71116_4
71116_5    71116_6    71116_7    71116_8

我发现了一个类似的问题这里,但是给出的解决方案似乎有点复杂!有更简单的解决方案吗?

答案1

因此,鉴于您提供的信息有限,让我陈述一下我的假设,如果有任何错误,请告诉我,我/我们可以调整答案。这些假设对于保持逻辑简洁明了至关重要,否则你就会陷入“过度杀戮”模式。

假设 1. 文件的“后缀”就是您想要更改的内容,“后缀”是下划线后的数字,这意味着下划线(“_”)是您的分隔符。

假设 2. 原始文件名中只会有一个下划线 - 不会有两个或多个下划线,也不会没有下划线

假设 3。您希望“前缀”(即分隔符之前的值(如假设 1 中所定义))保持完全相同。

假设 4。无论原始后缀如何,您都希望新后缀使用相同的分隔符(如假设 1 中所定义),并且新后缀不按时间戳或除之前的排序顺序之外的任何其他值递增重命名(意思是,由文件名的原始字母数字排序顺序驱动)。

假设 5。您希望它相当“简单”,不幸的是,这完全是任意的,但我将其定义为“没有复杂的 for 循环或 while 循环”和“没有太多奇怪的 sed 或 awk”命令。

因此,这不是一个难题,但考虑到列出的限制,它确实成为一个有趣的挑战。无论如何,我仍然求助于使用“简单”for 循环和“简单”awk:

cnt=0
for i in *; do
  let cnt=cnt+1
  mv "$i" "$(echo "${i}_${cnt}" | awk -F_ '{print $1"_"$3}')"
done

如果同一目录中有其他文件您不想重命名,就像我最初的测试中的情况一样(我正在该/tmp目录中测试,其中有其他我不想重命名的文件),然后使用以下部分进行过滤前缀,像这样:

cnt=0
for i in 71116*; do
  let cnt=cnt+1
  mv "$i" "$(echo "${i}_${cnt}" | awk -F_ '{print $1"_"$3}')"
done

我确实查看了您链接中的答案 - 我同意这些答案是过分的矫枉过正,就像 stackexchange 上的许多答案一样。然而,大多数“过度杀伤”的答案依赖于较少的假设,因此从理论上讲,它们比我在这里提供的更“通用”和/或更“便携”。

相关内容