Иметь данные и *.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 в качестве драйвера вместо расширения оболочки, поскольку вы не будете открывать tsv один раз для mp3. Удалите , 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
Remove echo
для фактического выполнения переименования, но сначала запустите его с ним, чтобы убедиться, что это то, что вам нужно. Также обратите внимание, что есть небольшая вероятность, что это mv
не удастся, потому что исходный файл будет уже удален к тому времени, когда выполнение скрипта достигнет этой строки — вы можете использовать set -e
для выхода сразу после первой mv
неудачи.