我有一些目录,想将其名称更改为{00..16}
。
$ ls
'FVSFT1092A' 'FVSFT1092I'
'FVSFT1092B' 'FVSFT1092J'
'FVSFT1092C' 'FVSFT1092K'
'FVSFT1092D' 'FVSFT1092L'
'FVSFT1092E' 'FVSFT1092M'
'FVSFT1092F' 'FVSFT1092N'
'FVSFT1092G' 'FVSFT1092O'
'FVSFT1092H' 'FVSFT1092P'
针对这种情况有什么命令吗?
答案1
可能有更好的方法,但我将这样做:
file-rename -n 's/.*/sprintf "%02d", ++our $i/e' FVSFT1092?
如果您的 shell 告诉您该file-rename
命令不存在,请安装该rename
包。
如果您只想替换最后一个字符,而不是原始名称中的所有内容,则可以使用此方法:
file-rename -n 's/.$/sprintf "%02d", ++our $i/e' FVSFT1092?
如上所述,这些命令不会重命名任何文件。需要重命名时,请删除-n
。在删除 之前-n
,您应该检查输出。它应该显示每个文件被重命名为什么。您还应该确保只列出您真正想要重命名的文件,而不是其他文件。对于上面显示的第一个命令,它应该显示以下内容:
rename(FVSFT1092A, 01)
rename(FVSFT1092B, 02)
rename(FVSFT1092C, 03)
rename(FVSFT1092D, 04)
rename(FVSFT1092E, 05)
rename(FVSFT1092F, 06)
rename(FVSFT1092G, 07)
rename(FVSFT1092H, 08)
rename(FVSFT1092I, 09)
rename(FVSFT1092J, 10)
rename(FVSFT1092K, 11)
rename(FVSFT1092L, 12)
rename(FVSFT1092M, 13)
rename(FVSFT1092N, 14)
rename(FVSFT1092O, 15)
rename(FVSFT1092P, 16)
运行它而不-n
实际重命名文件。您应该几乎总是先运行file-rename
(以及相关命令prename
和rename
)以-n
进行试运行。但在这种情况下,它比平常更重要,因为在这种情况下,命令的行为可能会因不同的区域设置而有所不同,或者如果您有其他不想重命名的类似名称的文件。
该命令的工作方式是,shell 会扩展FVSFT1092?
为当前目录中所有名称后跟FVSFT1092
任意一个附加字符的文件列表。此列表将传递给命令file-rename
,该命令将根据(上面显示的第一个命令中)Perl 表达式修改名称:
s/.*/sprintf "%02d", ++our $i/e
它将传递给它的任何文件名重命名为尚未使用的最小数字(以 开头)1
,并将其格式化为两位数,即使它小于 10。因此,它取决于提供文件名的顺序,而这又取决于当前目录中实际存在哪些文件以及 shell 以何种顺序展开它们。
这应该可以工作。在奇怪的极端情况下,它不会按照您的意愿运行,并且可以通过-n
首先运行命令(如上所示)轻松检查这一点,无论如何您都应该这样做以发现任何错误。
有关命令接受的语法如何file-rename
工作的一般信息,我建议在 Ubuntu 中批量重命名文件;rename 命令的简要介绍(经过奥利)。