ファイル名のリストからファイル名を変更する

ファイル名のリストからファイル名を変更する

私はまだシェル スクリプトの初心者なので、このコマンドは間違いなく間違っていると思います。ファイルのフォルダーの名前を txt ファイル内の名前に変更しようとしています。前提条件は、filenames.txt とフォルダー内のファイルが、システムの最初の行と最初のファイルが一致するように既に整理されていることです。私が得た結果は次のとおりです。

while read line; do echo -e "$line\n" | for f in *mkv do mv f $1; done < filenames.txt

しかし、うまくいきませんでした。修正を手伝ってもらえますか?

ありがとう

答え1

ファイル名を変更するアルゴリズムルールがない場合(つまり、実際に入力としてファイルが必要な場合)、次のことをお勧めします。

  1. 名前を変更したいファイルのリストから txt ファイルを作成します。例:

    . -name "*.mkv" > files.txt を検索します

  2. このファイルを編集し、各行の古い名前の後に新しい名前を追加します。例:

    ./myfirst.mkv ./mynewfirst.mkv

  3. このファイルを処理します:

    行を読み取りながら、eval mv $line を実行します。done < files.txt

答え2

私はここからインスピレーションを得ています:https://unix.stackexchange.com/a/26604

ファイルとディレクトリ内のファイルの両方を同時にループする必要があるようです。

DIR=./thefiledir
while : ; do
    read -r oldfile <&3
    read -r newfile <&4
    if [ -z "$oldfile" -o -z "$newfile" ]; then
        break
    fi
    mv $oldfile $newfile
done 3< <( find $DIR -maxdepth 1 -type f | sort ) 4< filenames.txt

ファイルにディレクトリ名があるかどうかはわかりませんので、行の前にfilenames.txtを入れて、これが目的の動作になるかどうかをテストすることをお勧めします。echomv

また、別の方法で試してみるかもしれません...新しい名前でファイルを生成する方法がわかりませんが、別の回答が示唆しているように、古い名前と新しい名前のファイルをループするか、名前を読み取ってロジックを適用して新しい名前を作成することができます。

関連情報