如何删除多个文件名中特定字符后的字符串?

如何删除多个文件名中特定字符后的字符串?

我的文件夹中有多个具有这种名称格式的文件

01. file one-sdvanv-12lknl.srt
01. file one-sdvanv-12lknl.mp4
02. file two-afdsmakl-asdfafdaf.srt
02. file two-afdsmakl-asdfafdaf.mp4
03. file three-adfadaasd-asdfadfafad-adad1d1das.srt
03. file three-adfadaasd-asdfadfafad-adad1d1das.mp4

现在如何删除后面的字符串-,使文件名看起来像这样

01. file one.srt
01. file one.mp4
02. file two.srt
02. file two.mp4
03. file three.srt
03. file three.mp4

答案1

for file in *; do
    ext=.${file##*.}                #Gets file extension
    [ "$ext" = ".$file" ] && ext="" #If file had no extension, set it to empty string
    nostr=${file%%-*}               #Remove everything after -
    mv "$file" "$nostr$ext"
done

答案2

您可以像这样使用 bash 参数替换:

for i in *; do
  # ${i%%-*} get everything before the first '-' (use ${i%-*} for the last '-')
  # ${i/.*} remove everything after the '.'
  # ${i##${i%.*}} remove everything except everything after the last '.'
  mv "${i}" "${i%%-*}${i##${i%.*}}"
done

答案3

在中使用循环bash

for name in *.mp4 *.srt; do
    mv -i -- "$name" "${name/-*./.}"
done

这通过变量替换的方式,通过用点替换名称中第一个破折号和最后一个点之间的部分来重命名每个.mp4文件和文件。.srt

我选择专门挑选.mp4.srt文件,因为这些是您在问题中显示的文件。

使用便携式sh循环:

for name in *.mp4 *.srt; do
    mv -i -- "$name" "${name%%-*}.${name##*.}"
done

这里,${name%%-*}将是原始名称,其中第一个破折号被切断后的所有内容,${name##*.}将是文件名中最后一个点之后的文件名后缀。


使用 Perlrename实用程序:

$ tree
.
|-- 01. file one-sdvanv-12lknl.mp4
|-- 01. file one-sdvanv-12lknl.srt
|-- 02. file two-afdsmakl-asdfafdaf.mp4
|-- 02. file two-afdsmakl-asdfafdaf.srt
|-- 03. file three-adfadaasd-asdfadfafad-adad1d1das.mp4
`-- 03. file three-adfadaasd-asdfadfafad-adad1d1das.srt

0 directory, 6 files
$ rename 's/-.*\././' -- *.mp4 *.srt
$ tree
.
|-- 01. file one.mp4
|-- 01. file one.srt
|-- 02. file two.mp4
|-- 02. file two.srt
|-- 03. file three.mp4
`-- 03. file three.srt

0 directory, 6 files

Perl 表达式s/-.*\././是一个替换,它将应用于每个给定的文件名,从而重命名该文件。

此替换将文件名中从第一个破折号到最后一个点的部分替换为点。

您可能需要添加-n到该实用程序的调用中rename以首先查看会发生什么。

也可以看看:

相关内容