Bashでファイル名の末尾の文字を削除する方法は?


13

以下のようなメディアファイルがたくさんあります。

tvshow.s01e11]Bloodlines.avi
tvshow.s01e12]suffer.avi
tvshow.s01e13]NotMe.avi

私はそれらの名前を変更したいと思います

tvshow.s01e11.avi
tvshow.s01e12.avi
tvshow.s01e13.avi

私は名前変更を使用しようとしましたが、明らかに失敗するので構文が正しくありません。


あなたがこれをGUIで行いたいなら、krename素敵です。あらゆる種類の強力なオプションがあり、実際に実行する前に何を実行するかを示します。これを使用して、後でbashで使用できるパターンをテストすることもできます。
ジョー

回答:



14

シェルでは、次のことが簡単にできます。

for x in *]*.avi ; do 
    mv -i "$x" "${x%]*.avi}.avi"
done

シェルは、通常のglobだけでファイル名のリストを作成し、${var%pattern}variableの文字列の末尾から(最短の)一致するパターンを 削除しますvar。最終的な拡張子は常にですので.avi、パターンでそれを削除し、追加し直しました。引用符を使用すると、次のようにスペースを含むファイル名でも機能するはずですFancy Name for a Show.s01e01]Asdf.avi


@NoviceC extglobパターンは悪い考えではありませんでした。実際には、やる${x/]*([^.])}べきことのように、ブラケットと任意の数の非ドットを削除します。(文字列の最後にロックされていないため、他のブラケットまたはドットがある場合は失敗します)
-ilkkachu

それは良い点です。しかし、私は実際に私が一緒に行くべきであるときに問題を過度に複雑にし、あなた${x/]*.avi}.aviようなものを追加しました。しかし、名前のスペースがどのように壊れるかについても不満(`find . -name '*]*.avi'`)でした。名前を変更することはできないので、限られた標準のUNIXコマンドメソッドを提供できてうれしいですが、これは私のものを吹き飛ばします。
初心者C

2

これはすべての種類の非実用的です-他の答えははるかに速くて短いです-しかし...

PowerShellを使用できます!マイクロソフトは最近それをオープンソース化し、クロスプラットフォームにしました。OSのダウンロードおよびインストール手順については、「Get PowerShell」セクションを参照してください。

インストールしたら、次の簡単なスクリプトを使用できます。

Get-ChildItem -File '*]*.avi' | ForEach-Object {
    Rename-Item $_ -NewName (($_.Name -Split ']')[0] + '.avi')
}

基本的には、現在のディレクトリ内のファイルマッチング*]*.aviである各オブジェクトを通過し、ブラケットの前の部分を取得し、.aviそれに追加して、新しい名前として割り当てます。

Bashから直接実行するには、このセミゴルフワンライナーを使用します。

powershell -command $'gci -File \'*]*.avi\'|%{rename-item $_ -NewName (($_.Name -Split \']\')[0]+\'.avi\')}'

このStack Overflowの回答のおかげで引用を逃します

(Windows上のUbuntuでBashでテストしました。PowerShellで行う方法はおそらくもっと短いかもしれませんが、正規表現を知らない人にわかりやすいものを見せたかったです。)


ルーベ・ゴールドバーグは誇りに思うでしょう!正規表現は学ぶべき本当のPITAですが、何度も試してみる価値があります-初歩的なレベルでさえ、私はそれらを使用することができます。
ジョー

1

Debianにはmmvと呼ばれるパッケージがあり、これは他のディストリビューションでも利用可能であり、そうでない場合はソースからコンパイルするのに十分簡単でなければなりません。これを書くことができます:

mmv '*]*.avi' '#1.avi'

あなたは読むことができますUbuntuのmanページを詳細については、このコマンドのために。


0

これにより、パターンが検索され、sedを使用してテキストが置き換えられます。

 $sed 's/\(.*]\)[a-zA-z0-9].*\(.avi\)/\1\2/' filename
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.