刪除檔案副檔名後的所有字符

刪除檔案副檔名後的所有字符

我有幾十個文件,例如:

title.mkv]-[72+167] - "" yEnc  637005001 (1+889)

我想刪除“之後的所有內容”.mkv

我嘗試尋找一些對我有幫助的正則表達式,但我不明白如何使用它們。

有人可以幫我嗎?

答案1

rename等的註解prename參見:

在這個答案中使用 Perl 變體,而不是 util-linux 的一種形式。正如不:

$ rename --version
rename from util-linux 2.31.1

但:

$ rename --version
/usr/bin/rename using File::Rename version 0.20

或類似的。


使用 Perl 重新命名:

rename 's/\.mkv.*/.mkv/s' ./*.mkv*

首先使用該-n選項以確保它符合您的要求。

rename -n 's/\.mkv.*/.mkv/s' ./*.mkv*

簡而言之:

s/\.mkv.*/.mkv/s

是:

substitute/<THIS>/<WITH THIS>/s

\.mkv.*匹配文字點,\.然後匹配字串mkv,最後匹配任何字元(包括\n您需要s標誌的字元)零次或多次.*

結果替換.mkv<anything>.mkv.


有一些工具可以幫助閱讀和建立表達式,例如https://regex101.com/

答案2

bash

for f in *; do [[ "$f" =~ ^.+\.mkv ]] && mv "$f" "${BASH_REMATCH[0]}"; done

答案3

zshzmv:

autoload zmv
zmv -v '(*.mkv)*' '$1'

刪除後的部分最右邊的.mkv檔案名稱中出現 的情況(重新命名foo.mkv-bar.mkv-whateverfoo.mkv-bar.mkv)。

為了最左邊出現(將該檔案重新命名為foo.mkv),您可以替換*.mkv*.mkv~*.mkv?*匹配以結尾.mkv但也不包含.mkv後跟至少一個字元的字串,使用~“例外”全域運算符

答案4

在腳本 bash 中

#!/bin/bash
for i in *.mkv*
do
  j=$(echo "$i" | sed -e 's/\.mkv.*$/.mkv/')
  mv -- "$i" "$j"
done

相關內容