Contar con datos y *.tsv
archivo donde se describen los datos. Me gustaría utilizar la descripción y cambiar el nombre de los datos en consecuencia.
Por favor échale un vistazo :
awk
comando para filtrar el tsv da esto:common_voice_en_22090684.mp3 four common_voice_en_22090691.mp3 no common_voice_en_22090696.mp3 one
pasa por el directorio donde se
*.mp3
encuentran:for i in *.mp3 ; do echo $i
mv
es un comando para cambiar el nombre del archivo y se necesitan dos argumentos (el archivo a cambiar y con qué)
¿Cómo usar awk
(leer y usar la descripción) y mv
(cambiar el nombre de los archivos existentes con la descripción pasada? Entonces, mirando el ejemplo anterior, el resultado sería:
four.mp3
no.mp3
one.mp3
No es importante utilizar los comandos sugeridos. ¡Cualquier idea o sugerencia sobre cómo hacer esto es bienvenida!
Respuesta1
Esto no cumple con sus requisitos, pero si espera procesar muchos archivos, puede obtener un mejor rendimiento usando su .tsv como controlador en lugar de una expansión de shell, porque no abrirá el tsv una vez por mp3. Elimine el echo
si parece que haría lo que espera.
$ while read -r src tgt; do [ -f "$src" ] && echo mv -i "$src" "$tgt.mp3"; done < file.tsv
Respuesta2
IIUC, quieres algo como esto después de guardar el resultado decomando awk para filtrar el tsven archivo:
#!/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
Elimínelo echo
para realizar el cambio de nombre, pero ejecútelo primero para asegurarse de que sea lo que necesita. También tenga en cuenta que existe una pequeña posibilidad de que mv
falle porque el archivo original ya estará eliminado cuando la ejecución del script llegue a esa línea; puede usar set -e
para salir inmediatamente después del primer mv
error.