web-dev-qa-db-ja.com

Bashでファイル名の末尾の文字を削除するにはどうすればよいですか?

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

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

名前を変更したい

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

名前の変更を使用しようとしましたが、失敗したため、構文が正しくないようです。

13
Widgeteye

これにより、ファイルの名前が変更されます。任意の数の英数字を表すには、\ w *が必要です。

rename 's/\]\w*//' *

参照: http://www.troubleshooters.com/codecorn/littperl/perlreg.htm#UsingSimpleWildcards

9
LvxOne

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

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

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

14
ilkkachu

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

PowerShellを使用できます! Microsoft オープンソース 最近、クロスプラットフォームにしました。 OSのダウンロードとインストール手順については、 「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でそれを行うにはおそらくはるかに短い方法がありますが、正規表現を知らない人にも理解できるものを示したかったのです。)

2
Ben N

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

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

詳細については、このコマンドの buntuのマニュアルページ を参照してください。

1
MvG

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

 $sed 's/\(.*]\)[a-zA-z0-9].*\(.avi\)/\1\2/' filename
0
Tejender Mohan