使用util-linux重命名命令

9
我一直在尝试使用util-linux版本的rename(2011)来将所有文件中的特定字符串替换为另一个。虽然我知道perl版本的rename可以提供解决方案,但我不知道如何使用这个版本的rename。
具体示例是一组文件(something--2013.mkv,somethingelse--2011.mkv),我正在尝试删除双破折号并用空格替换。

1
你尝试过像这样的代码吗?rename 's/--/\ \ /' *.mp4 - neeru
4
"rename 's///' " 是 Perl 版本的语法,而不是 util-linux 的版本。如果我使用的是 Perl 版本,你的命令就可以用于 .mp4 文件 :) - user3179658
“--” 意味着程序使用“getopt”(例如“rename”)时选项的结束。解决方案很可能是找到绕过它的方法。也许您可以先将“-”翻译成其他内容(例如“_”),然后再替换它? - jackrabbit
当然不会:shell解释引号,命令只是得到-- - jackrabbit
将单个破折号逐一重命名为下划线,然后重命名双下划线即可解决问题。如果您想发布答案,我可以将其标记为已解决。 - user3179658
显示剩余3条评论
3个回答

11
问题在于rename使用getopt进行参数解析,因此对双破折号(--)有特殊解释。 --表示参数的结尾。
避免在您的命令中使用--是一种解决方法。一种方法是将您的命令分成子目标,例如将单破折号翻译为下划线,然后再将两个下划线翻译为单破折号:
$ rename - _ *.mkv
$ rename __ - *.mkv

更直接的方法是实际使用 getopt 行为。

$ rename -- -- - *.mkv

1
重命名工具从util-linux改为在Ubuntu中的/usr/bin/rename.ul。因此,您可以使用rename.ul命令。

0
mkdir TEMP
numbers=2011
find . -name "*.mkv" | while read filename
do
  echo mv "$filename" "TEMP/somethingelse_"$((numbers++)).mkv
  rm filename
done

1
此脚本不使用 util-linux 版本的 rename。 - user3179658

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接