我正在使用带有数字前缀的命名约定来跟踪某些文件。但是我有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'
既然这是基于正则是正则是基于正则的,我可以以某种方式保存匹配组11
和12
?
如果我无法使用重命名,我可能会写一个快速的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]。*'的文件,该文件是否存在是否存在。