2016-09-13 27 views
0

複数のビデオ講義を含む複数のフォルダがあります。 ファイル名(ビデオ)はtopic blah blah blah - Lecture xx.mp4のように改名しますLecture xx.mp4ファイルの名前を変更するためのBashスクリプト

私は以下のbashスクリプトを書いています。ハングアップしているように見えますが(遅くなります)、出力も出ません。

for file in *.mp4; do 
    echo "Renaming file :: $file" 
    nn=$(grep -o 'Lecture.[0-9]*' "$file") 
    echo $nn 
    #mv "$file" "$nn" 
done 

このスクリプトを修正するために助けてください。

答えて

2

実際に$fileのパラメータ値を変更する場合、スクリプトはファイル(grep pattern [FILE...])の内容を検索します。これは、なぜあなたのコマンドが遅く、動作しないように見えるのか説明する必要があります。

$fileパラメータの値を変更するには、パラメータ拡張man bashを参照)というBash機能を使用できます。あなたのケースでは${parameter##word}が一致する接頭辞パターンを削除することができます。 ${file##* - }は、* -の最長一致を削除します。 * -は正規表現ではなくパターンです。パターンマッチングは正規表現と異なります(*.*を比較)。

#!/usr/bin/bash 

for file in *.mp4; do 
    new=${file##* - } 
    echo "Renaming '$file' to '$new'" 
    #mv "$file" "$new" 
done 
+0

しかし、「間違い」に「 - 」文字が含まれることがあります。 – vvy

+1

スペースダッシュスペースへの依存を避ける別の方法: 'new = $ {file/* Lecture/Lecture}' – John1024

+0

@Johnそれは動作します。 @ MichaWiedenmann多くのありがとう。問題は解決されますが、なぜそれが 'nn = $(grep -o 'Lecture。[0-9] *'" $ file ")'遅くて間違っているのか説明してください。私は同じく間違った方法で 'sed'を試みました。 – vvy

1

renameプログラムを使用すると、もっと簡単に使用できます。これはPerlスクリプトです。あなたのケースでは、あなたがどうなる:あなたはそれが言っているような場合

rename --dry-run 's/.*(Lecture \d+)/$1/' *mp4 

出力

'topic blah blah blah Lecture 01.mp4' would be renamed to 'Lecture 01.mp4' 
'topic blah blah blah Lecture 02.mp4' would be renamed to 'Lecture 02.mp4' 
'topic blah blah blah Lecture 555556.mp4' would be renamed to 'Lecture 555556.mp4' 

その後--dry-runを削除します。これは、ほとんどのアドホックシェルスクリプトに比べてファイルを壊さず、ドライランを実行できるという利点があり、非常に複雑な作業を簡単に実行できるように完全なPerl構文をサポートしています。

+0

は役に立ちそうです、ありがとうございます。 – vvy

関連する問題