Есть много способов обмануть этого кота. Я бы использовал вызов команды find:
for file in $(find . -name '*.mp3') do
echo $file
TITLE=$(id3info "$file" | grep '^=== TIT2' | sed -e 's/.*: //g')
ARTIST=$(id3info "$file" | grep '^=== TPE1' | sed -e 's/.*: //g')
echo "$ARTIST - $TITLE"
done
Если у вас есть пробелы в именах файлов, лучше использовать параметр -print0
для поиска; один из возможных способов заключается в следующем:
find . -name '*.mp3' -print0 | while read -d $'\0' file
do
echo $file
TITLE=$(id3info "$file" | grep '^=== TIT2' | sed -e 's/.*: //g')
ARTIST=$(id3info "$file" | grep '^=== TPE1' | sed -e 's/.*: //g')
echo "$ARTIST - $TITLE"
done
в качестве альтернативы вы можете сохранить и восстановить IFS
. Благодаря комментариям Дэвида В. и, в частности, указывая на то, что версия цикла while
также имеет то преимущество, что она будет обрабатывать очень большое количество файлов правильно, тогда как первая версия, которая расширяет $(find)
до for-loop не сможет работать в какой-то момент, поскольку расширение оболочки имеет ограничения.