ファイル拡張子の後のすべての文字を削除する

ファイル拡張子の後のすべての文字を削除する

次の数十のファイルがあります。

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

「以降のすべて」を削除したい.mkv

私に役立ついくつかの正規表現を探しましたが、使い方を理解できませんでした。

誰でも私を助けることができますか?

答え1

renameご意見はprename下記をご覧ください。

この回答では、util-linux形式ではなくPerlバリアントを使用しています。いいえ:

$ 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)を0回以上一致させます.*

結果.mkv<anything>はに置き換えられます.mkv


次のように式を読み取って整理するのに役立つツールがあります。https://regex101.com/

答え2

存在するbash

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

答え3

そしてzsh~のzmv:

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

削除された部分一番右.mkvファイル名にエントリがあります(foo.mkv-bar.mkv-whateverに名前が変更されましたfoo.mkv-bar.mkv)。

~のため一番左(ファイル名をに変更)、「例外」を使用して次に終わりますが、後に1つ以上の文字がない文字列を一致させることでfoo.mkv置き換えることができます。*.mkv*.mkv~*.mkv?*.mkv.mkv~グローバルオペレータ

答え4

スクリプトバッシュから

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

関連情報