Вот что я сделал. Кажется, это сработало (но, к сожалению, bpm-tag не был достаточно точным для многих песен ...).
#!/bin/bash cd /path/to/my/library while IFS= read -r -d '' FILE; do BPM=$(bpm-tag -f -n "$FILE" 2>&1 | sed "s/.mp3:/%/" | cut -d'%' -f2 | sed "s/ BPM//" | sed "s/^ //" | cut -d'.' -f1) #bpm-tag has its output in stderr, so I use 2>&1 to redirect it to stdout, then format it with sed and cut if [ "$BPM" -le 130 ] then cp "$FILE" /path/to/my/library/Slow/ elif [ "$BPM" -le 180 ] then cp "$FILE" /path/to/my/library/Medium/ else cp "$FILE" /path/to/my/library/Fast/ fi done < <(find . -type f -name '*.mp3' -print0)
Здесь делают
while IFS= read -r -d '' FILE; do echo "$FILE" done < <(find . -type f -name '*.mp3' -print0)
печатает все файлы (-type f), заканчивающиеся на .mp3 (-name '* .mp3'), которые находятся в папке или одной из ее подпапок. Насколько я понимаю, параметры -print0 и -r -d '' предназначены для форматирования, но я не совсем понимаю, как это работает.