重命名多个目录递减序列号?

use*_*ser 3 bash rename

我有一个目录,其中包含许多格式为dir.##. 前缀总是相同的,后缀是严格递增的1-3位数字。因此,类似于:

dir.0
dir.1
dir.2
dir.3
...
dir.9
dir.10
dir.11
...
dir.298
dir.299
dir.300
Run Code Online (Sandbox Code Playgroud)

首先,我想删除前几个这样的目录。这是微不足道的。

然后,我想重命名所有后续目录以移动数字后缀,例如dir.7变成dir.0dir.8变成dir.1dir.10变成dir.3等。也就是说,将每个后缀(视为数字)移动给定的恒定偏移量。

如何在不单独和手动重命名每个目录的情况下执行此类重命名操作

我可以为它使用单独的工具,但是如果我可以在没有“异国情调”软件的情况下在 bash 中完成所有工作,那就太好了。

Gil*_*il' 7

这种递减可以通过一种非常低技术的方式来完成:生成列表,从头开始。通过处理所有情况来“产品化”并不是那么容易,但如果您愿意对最大位数等内容进行硬编码并假设没有其他名为dir.*. 使用 bash 语法,调整为减少输入:

i=0
for x in dir.{?,??,???}; do
  mv "$x" "${x%.*}.$i"
  ((++i))
done
Run Code Online (Sandbox Code Playgroud)

请注意,它必须是,dir.{?,??,???}而不是dir.*dir.9之前获得dir.10

在 zsh 中,您可以通过使用<->扩展到任何数字序列(n)并按数字排序(dir.9before dir.10),使其更健壮,无需任何代价。

i=0
for x in dir.<->(n); do
  mv $x ${x%.*}.$i
  ((++i))
done
Run Code Online (Sandbox Code Playgroud)