我有一个目录,其中包含许多格式为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.0
、dir.8
变成dir.1
、dir.10
变成dir.3
等。也就是说,将每个后缀(视为数字)移动给定的恒定偏移量。
如何在不单独和手动重命名每个目录的情况下执行此类重命名操作?
我可以为它使用单独的工具,但是如果我可以在没有“异国情调”软件的情况下在 bash 中完成所有工作,那就太好了。
这种递减可以通过一种非常低技术的方式来完成:生成列表,从头开始。通过处理所有情况来“产品化”并不是那么容易,但如果您愿意对最大位数等内容进行硬编码并假设没有其他名为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.9
before dir.10
),使其更健壮,无需任何代价。
i=0
for x in dir.<->(n); do
mv $x ${x%.*}.$i
((++i))
done
Run Code Online (Sandbox Code Playgroud)