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

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

次のようなファイルが数十個あります:

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

zshzmv:

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

後続の部分を削除します右端.mkvファイル名にが出現します(foo.mkv-bar.mkv-whateverに名前が変更されますfoo.mkv-bar.mkv)。

のために左端出現(foo.mkv代わりにそのファイルの名前を変更する)には、で終わる文字列に一致するが、それ以外は含まれない文字列に「except」を使用して少なくとも1文字続く文字列*.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

関連情報