*.tsv ファイルに awk 出力を渡してファイル名を変更する

*.tsv ファイルに awk 出力を渡してファイル名を変更する

データを保持し、*.tsvデータを記述するファイルです。説明を使用し、それに応じてデータ名を変更したいと思います。

これを見てください:

  • awktsvをフィルタリングするコマンドは次のとおりです。

      common_voice_en_22090684.mp3 four
      common_voice_en_22090691.mp3 no
      common_voice_en_22090696.mp3 one
    
  • 次のディレクトリを参照してください*.mp3

    for i in *.mp3 ; do
    echo $i
    
  • mvファイル名を変更するコマンドで、2つのパラメータ(変更するファイルと変更する内容)を使用します。

awk(説明の読み取りと使用)と(転送された説明を使用)を使用してmv既存のファイルの名前を変更するには?したがって、上記の例を見ると、結果は次のようになります。

four.mp3    
no.mp3  
one.mp3 

どのコマンドを使用するかは問題ではありません。これを行う方法のアイデアや提案は非常に歓迎されています!

答え1

これは要件を満たしていませんが、多くのファイルを処理したい場合は、mp3ごとにtsvを一度は開かないので、シェル拡張子ではなく.tsvをドライバとして使用すると、パフォーマンスが向上します。echo期待どおりに機能しているような場合は、削除してください。

$ while read -r src tgt; do [ -f "$src" ] && echo mv -i "$src" "$tgt.mp3"; done < file.tsv

答え2

IIUC、出力を保存した後、次のようなものが必要です。awkコマンドはtsvをフィルタリングします。ファイルから:

#!/usr/bin/env sh

for i in *.mp3
do
    new_name="$(awk -v name="$i" '$1 == name {print $2}' file)"
    if [ -n "$new_name" ]
    then
        echo mv -- "$i" "$new_name"
    fi
done

実際に名前を変更するには削除を行いますechoが、必要に応じて確認するにはまず実行します。また、mvスクリプトの実行がその行に達すると元のファイルが削除されるため、失敗する可能性はほとんどありません。set -e最初のmv失敗後すぐに終了できます。

関連情報