ファイル名を変更して各ファイル名を求めるForループ

ファイル名を変更して各ファイル名を求めるForループ

1つのフォルダにある複数のビデオファイルを変換する必要があります。それぞれの名前を変更する必要がありますが、各ファイル名に対してカスタム名を書き込むように求めるスクリプトが必要です。これが私が今まで得たものです:

  1. まず、次のコマンドを使用して、スクリプトが実行するファイル名からスペースを削除する必要があります。

    for f in *' '*; do mv "$f" "`echo $f | sed -e 's/ /_/g'`"; done
    
  2. 変換には必要ないため、ファイル拡張子を削除しました。私は次のコマンドを使用します。

    for x in *; do mv $x $(echo ${x%*.*}); done
    

次に、パターンの各ファイル名を変更するにはforループが必要です。

for i in * ; do mv $i $customname; done

$customname問題は、その段階で各ファイルの変数にどの名前を追加するかを尋ねるスクリプトが必要であることです。このような:

Rename file1 to:
.......

Rename file2 to:
.......

答え1

read以下のようにSTDINで1行を読んでください。

for FILE in *; do
    echo "Rename '$FILE' to:"
    read NAME
    mv "$FILE" "$NAME"
done

この例では、完了時に中断するにはCtrl-Cを押す必要がありますが、if名前を入力しなかった場合など、追加の状況を追加して中断できます。

編集する:すべてのターゲットファイルに元のファイルと同じファイル拡張子がある場合(たとえば、ファイルが呼び出され、名前が変更されたファイルを手動で入力せずに終了を維持pogo.jpgしたい場合)、次のコマンドを変更できます。上記のループ:.jpgmv

mv "$FILE" "$NAME.${FILE##*.}"

${FILE##*.}上記の文字列の内容は、次のことを意味します。

  • ${FILE...}変数を表示し$FILEますが...
  • ##一致する最も長い文字列を最初から削除します(#最も短い文字列のみ一致)。
  • *0個以上の文字と一致します。
  • .リテラル期間の一致

完全な式(*.)は一致する場合にのみ削除されます。したがって、元のファイル名にピリオドがない場合は、奇妙な結果が得られ、新しいファイル名になりますNEWNAME.OLDNAME

答え2

これは、テレビ番組から名前を取得するスクリプトを書く前にUSB-PVRで使用していました。

#!/bin/bash

for f in "$@"
do
    echo Playing "$f"...
    mplayer "$f"
    echo That was "$f".
    read -p "New name? " newname

    if [ "$newname" != "" ]
    then
        mv -v -i "$f" PVR-"$newname".mkv
    fi

    sleep 1
done

ファイルの名前を変更する方法は本当に退屈です。

関連情報