有条件地替换文件名中的字符

时间:2016-11-27 00:03:08

标签: bash shell

我正在尝试重命名: 01.black_cat.mp301_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可以更容易吗?我找到的所有示例都是文件末尾或文件名中所有实例的模式匹配。

4 个答案:

答案 0 :(得分:2)

我不明白您使用y///代替s///的原因。 也, 你需要在模式中逃避., 表达式可以写得更简单:

rename -n 's/^([0-9][0-9])\./$1_/' *mp3

这意味着,替换起始的两位数后跟一个带有数字后跟下划线的点。替换表达式中的$1表示模式中(...)内的匹配字符串。

答案 1 :(得分:1)

直接Bash:

math.h

这将遍历所有pow()个文件,并使用parameter expansion将第一个句点替换为下划线。

答案 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