通过在 *.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失败后立即退出。

相关内容