Быстрое расширение, соответствующее протоколу

Есть много способов обмануть этого кота. Я бы использовал вызов команды 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 не сможет работать в какой-то момент, поскольку расширение оболочки имеет ограничения.

13
задан Errortype520 23 July 2014 в 01:36
поделиться