如何刪除多個檔案名稱中特定字元後的字串?

如何刪除多個檔案名稱中特定字元後的字串?

我的資料夾中有多個具有這種名稱格式的文件

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以首先查看會發生什麼。

也可以看看:

相關內容