我有一个目录,其中包含许多名称格式为 的子目录dir.##
。前缀始终相同,后缀为严格递增序列的 1-3 位数字。因此,类似于:
dir.0
dir.1
dir.2
dir.3
...
dir.9
dir.10
dir.11
...
dir.298
dir.299
dir.300
首先,我想删除前几个这样的目录。这是微不足道的。
然后,我想重命名所有后续目录以移动数字后缀,例如dir.7
变为dir.0
、dir.8
变为dir.1
、dir.10
变为dir.3
等。也就是说,将每个后缀(视为数字)移动给定的常量偏移量。
如何执行这样的重命名操作无需单独手动重命名每个目录?
我可以使用单独的工具来完成它,但是如果我可以在 bash 中完成这一切而不需要“异国情调”的软件,那就太好了。
答案1
这种递减可以通过一种相当低技术的方式来完成:生成列表,从头开始。通过处理所有情况来“产品化”并不那么容易,但如果您愿意对诸如最大位数之类的内容进行硬编码并假设没有其他名为dir.*
.使用 bash 语法,减少输入:
i=0
for x in dir.{?,??,???}; do
mv "$x" "${x%.*}.$i"
((++i))
done
请注意,它必须是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
答案2
另一种方法:
n=7 # number to delete
max=$(printf "%s\n" dir.* | grep -o '[[:digit:]]*' | sort -n | tail -1)
for (( i=0; i<n; i++)); do rm -r "dir.$i"; done
for (( i=n; i<=max; i++ )); do mv "dir.$i" "dir.$((i-n))"; done
答案3
您还可以使用图形工具 KRename。
步骤如下:
- 选择文件
- 选择重命名文件的选项
- 打开 JavaScript 插件\
- 将字段前缀设置为空,后缀:空,文件名:使用原始名称,扩展名:其他扩展名:
[js;krename_extension-OFFSET]
其中OFFSET
是您需要递减的值。