bash:在前缀太短时,使用重命名的左PAD文件名以零为单位



我正在使用带有数字前缀的命名约定来跟踪某些文件。但是我有2位数的前缀。因此,我想移动到011.abc 012.def,而不是11.abc 12.def。我已经有一些013.xxx 014.yyy

在一个空目录中尝试此操作:

touch 11.abc 12.def 013.xxx 014.yyy

ls -1给出:

013.xxx
014.yyy
11.abc
12.def

尝试#1:

这应该匹配以2位数字开头的任何东西,但不匹配3个。

rename -n 's/^dd[^d]/0$1/' *

现在,我有点希望$1能像11一样举行比赛,0 $ 1给我011

没有这样的运气:

Use of uninitialized value $1 in concatenation (.) or string at (eval 2) line 1.
'11.abc' would be renamed to '0abc'
Use of uninitialized value $1 in concatenation (.) or string at (eval 2) line 1.
'12.def' would be renamed to '0def'

在积极的一面,它愿意独自离开013和014。

尝试#2 rename -n 's/^dd[^d]/0/' *

'11.abc' would be renamed to '0abc'
'12.def' would be renamed to '0def'

既然这是基于正则是正则是基于正则的,我可以以某种方式保存匹配组1112

如果我无法使用重命名,我可能会写一个快速的Python脚本。不想在上面使用mv循环。

,实际上,我的命名共同是2-3位数字,然后是一个点,所以这也是一个很好的匹配。

rename -n 's/^dd./<whatever needs to go here>/' *

对于它的价值,我正在使用Hommbrew版本的重命名,因为我在Mac上。

尝试以下:

rename 's/^(d{2}..*)/0$1/' *

rename是有问题的,因为它不是POSIX的一部分(因此通常在许多类似于Unix的系统上不可用(,并且在广泛使用中有两种截然不同的形式。查看为什么对Debian/Ubuntu的重命名实用程序与其他发行版(如Centos(不同?有关更多信息。

此BASH代码使用mv重命名(这是POSIX的一部分(:

#! /bin/bash -p
shopt -s nullglob  # Patterns that match nothing expand to nothing.
for f in [0-9][0-9].* ; do
    mv "$f" "0$f"
done
  • shopt -s nullglob是为了防止问题,如果代码是在没有需要重命名的文件的目录中运行的。如果未启用nullglob,则代码将尝试重命名为" [0-9] [0-9]。*'的文件,该文件是否存在是否存在。

最新更新