透過在 *.tsv 檔案上傳遞 awk 輸出來重新命名文件

透過在 *.tsv 檔案上傳遞 awk 輸出來重新命名文件

擁有資料和*.tsv描述資料的文件。想要使用描述並相應地重命名資料。

請看一看 :

  • awk過濾 tsv 的命令如下:

      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是重命名檔案的命令,它需要兩個參數(要更改的檔案以及更改內容)

如何使用awk(讀取和使用描述)和mv(使用傳遞的描述重命名現有文件?因此,請查看上面的範例,結果將是:

four.mp3    
no.mp3  
one.mp3 

使用建議的命令並不重要。任何關於如何做到這一點的想法、建議都是非常受歡迎的!

答案1

這不滿足您的要求,但如果您希望處理許多文件,則透過使用 .tsv 作為驅動程式而不是 shell 擴充功能可能會獲得更好的效能,因為您不會為每個 mp3 打開一次 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失敗後立即退出。

相關內容