在Linux中如何重命名一个目录中的多个文件并保留扩展名
我需要重命名目录中的文件,去掉一个字符串,每个文件都有不同的字符,但启动方式相同。我知道如何从文件名中删除字符,但如何保留扩展名?我知道这是一个普通问题的变体,但我找不到一个符合我确切需要的答案在Linux中如何重命名一个目录中的多个文件并保留扩展名,linux,bash,Linux,Bash,我需要重命名目录中的文件,去掉一个字符串,每个文件都有不同的字符,但启动方式相同。我知道如何从文件名中删除字符,但如何保留扩展名?我知道这是一个普通问题的变体,但我找不到一个符合我确切需要的答案 Redshirts_ep6_dSBHpCsvQ3BfQ7-NNIjXYO4pnHpNMvu7bfvURLF3BSzB_3YOOrBBoNnICTR-hg.mp3 -> Redshirts.mp3 PathsNotTaken_ep6_XWixFER4PJyeozVfcxT96UajpnVI7cRMR
Redshirts_ep6_dSBHpCsvQ3BfQ7-NNIjXYO4pnHpNMvu7bfvURLF3BSzB_3YOOrBBoNnICTR-hg.mp3
-> Redshirts.mp3
PathsNotTaken_ep6_XWixFER4PJyeozVfcxT96UajpnVI7cRMRhAU4Aj9-rpeacnBleuGY9zCPDe0aQ.mp3
-> PathsNotTaken.mp3
linux命令
rename
在这里非常有用。它可以使用正则表达式执行重命名
这可能会被重写一点,但它似乎与此处的作业有关:
rename -n 's/(^[^_]*)_.*/$1.mp3/' *.mp3
只需删除要真正运行的-n
标志。开着它只是一个测试
这个正则表达式说:
如果行开始处的字符不包含下划线
[^.]
且重复次数不超过*
的,则将其捕获到捕获组(^[^.]*)
,前提是这些字符后跟下划线和任何数量的任何其他字符.*
。然后使用第一个捕获组$1
,然后再使用.mp3
重写它们,因此您希望删除第一个\uu
及其后的所有内容,直到第一个
,这是正确的。mv$file${file/\u*/}
为什么不简单地重命名's/.*/.mp3/'*.mp3
?值得注意的是,这需要在基于Debian的发行版中找到的重命名
的Perl实现。其他发行版默认使用util linuxrename
工具,但该工具不起作用。