*.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

これは要件を満たしていませんが、多数のファイルを処理することが予想される場合は、シェル拡張ではなく .tsv をドライバーとして使用することで、mp3 ごとに tsv を 1 回開くことがなくなるため、パフォーマンスが向上する可能性があります。echo期待どおりに機能すると思われる場合は、 を削除します。

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

答え2

私の記憶では、出力を保存した後、次のようなものが欲しいと思いますtsv をフィルタリングする awk コマンドファイル内:

#!/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

実際に名前の変更を実行するにはRemove を使用echoしますが、最初にそれを実行して、必要なものが確実に実行されるようにします。また、スクリプトの実行がその行に到達するまでに元のファイルがすでに削除されているため、失敗する可能性がわずかにあることに注意してください。最初の失敗の直後に をmv使用して終了できます。set -emv

関連情報