我正在尝试重命名:
01.black_cat.mp3
至01_black_cat.mp3
但是当我跑步时:
rename -n 'y/^[0-9][0-9][.]*/^[0-9][0-9][_]*.mp3/' *.mp3
我明白了:
01.black_cat.mp3, 01_black_cat_mp3
我想要替换第一个句号,但忽略第二个句号。我究竟做错了什么?使用MMV可以更容易吗?我找到的所有示例都是文件末尾或文件名中所有实例的模式匹配。
答案 0 :(得分:2)
我不明白您使用y///
代替s///
的原因。
也,
你需要在模式中逃避.
,
表达式可以写得更简单:
rename -n 's/^([0-9][0-9])\./$1_/' *mp3
这意味着,替换起始的两位数后跟一个带有数字后跟下划线的点。替换表达式中的$1
表示模式中(...)
内的匹配字符串。
答案 1 :(得分:1)
答案 2 :(得分:0)
重命名为not POSIX,您可能更喜欢使用以下内容:
printf '%s\n' *.mp3 | sed 'p;s/\./_/' |
while
read pa
read qu
do
mv "$pa" "$qu"
done
答案 3 :(得分:0)
就像注释一样,y///
运算符与tr///相同,它将第一个列表音译为第二个。
示例:
$ echo 'abcdefg' | perl -ple 'y/a-d/A-D/'
ABCDefg
$ echo '12345' | perl -ple 'y/1-3/x-z/'
xyz45
如果您不知道,rename
基于Perl,那么您可以像我在这里一样测试它会做什么。
这是你可能想要做的事情:
$ echo '01.black_cat.mp3' | perl -ple 's/^(\d+)\./\1_/'
01_black_cat.mp3