Передача аргументов из строки строки в строку

У меня есть список некоторых mp3:

song 1.mp3 song 2.mp3 . . . song 349.mp3

Я вижу их битрейт с помощью правой кнопки мыши -> Свойства -> Аудио / Видео, но также я могу проверить его с помощью команды терминала

file "song 1.mp3"

Я хотел бы узнать, какой битрейт из моего списка наиболее часто используется, поэтому я подумал, что это будет хорошо сделано через оболочку, то есть сценарий оболочки.

Я тоже потерял бы много времени, если я набрал

file "song 1.mp3"; file "song 2.mp3"; ... ; file "song 349.mp3"

Итак, мой вопрос:

Можем ли мы передавать аргументы по строкам из некоторого текстового файла в функцию оболочки? Еще одна проблема заключается в том, что имена моих песен содержат пробелы.

4
задан 1 April 2018 в 03:17

4 ответа

Вы можете использовать glob оболочки, например *.mp3, чтобы выбрать все файлы в текущем каталоге, которые заканчиваются на .mp3. Это будет автоматически ухаживать за пробелами и другими специальными символами.

В mp3, который я тестировал, я получил такой вывод для file:

01 - Mystery Of A Blood Red Rose.mp3: Audio file with ID3 version 2.3.0, contains: MPEG ADTS, layer III, v1, 56 kbps, 44.1 kHz, Stereo

Вы сказали, что интересуются битовой скоростью, т. е. 56 kbps здесь. Мы можем использовать grep для извлечения только той части результата с регулярным выражением, как '\d+\s+kbps' (одна или несколько цифр, за которыми следует одно или несколько пробелов, за которым следует строка «kbps»).

] До сих пор вы можете использовать это, чтобы показывать только информацию о скорости передачи для всех mp3-файлов в текущем каталоге:

file *.mp3 | grep -Po '\d+\s+kbps'

Теперь это создает длинный список с одной строкой для каждого файла, но вы хотели хорошая статистика с полным счетом. Мы можем это сделать, сначала отсортировав список (используя режим сортировки натуральных чисел), а затем подсчитав, как часто появляется каждая уникальная строка. Инструментами для этого являются sort и uniq:

file *.mp3 | grep -Po '\d+\s+kbps' | sort -n | uniq -c

В одной из моих музыкальных папок вывод выглядел ниже. Первое число - это количество файлов, второе - скорость передачи:

16 32 kbps 18 56 kbps 67 128 kbps 3 192 kbps 6 256 kbps 38 320 kbps
5
ответ дан 17 July 2018 в 17:42

Предполагая, что ваш список файлов является одним именем файла в каждой строке, утилита xargs должна иметь возможность обрабатывать имена файлов с пробелами в них, если вы указываете новую строку как разделительный символ, например

xargs -d '\n' file < filelist.txt

Если вы предпочитают использовать функцию оболочки

while IFS= read -r f; do [[ -z "$f" ]] || file "$f"; done < filelist.txt
9
ответ дан 17 July 2018 в 17:42

Вы можете использовать glob оболочки, например *.mp3, чтобы выбрать все файлы в текущем каталоге, которые заканчиваются на .mp3. Это будет автоматически ухаживать за пробелами и другими специальными символами.

В mp3, который я тестировал, я получил такой вывод для file:

01 - Mystery Of A Blood Red Rose.mp3: Audio file with ID3 version 2.3.0, contains: MPEG ADTS, layer III, v1, 56 kbps, 44.1 kHz, Stereo

Вы сказали, что интересуются битовой скоростью, т. е. 56 kbps здесь. Мы можем использовать grep для извлечения только той части результата с регулярным выражением, как '\d+\s+kbps' (одна или несколько цифр, за которыми следует одно или несколько пробелов, за которым следует строка «kbps»).

] До сих пор вы можете использовать это, чтобы показывать только информацию о скорости передачи для всех mp3-файлов в текущем каталоге:

file *.mp3 | grep -Po '\d+\s+kbps'

Теперь это создает длинный список с одной строкой для каждого файла, но вы хотели хорошая статистика с полным счетом. Мы можем это сделать, сначала отсортировав список (используя режим сортировки натуральных чисел), а затем подсчитав, как часто появляется каждая уникальная строка. Инструментами для этого являются sort и uniq:

file *.mp3 | grep -Po '\d+\s+kbps' | sort -n | uniq -c

В одной из моих музыкальных папок вывод выглядел ниже. Первое число - это количество файлов, второе - скорость передачи:

16 32 kbps 18 56 kbps 67 128 kbps 3 192 kbps 6 256 kbps 38 320 kbps
5
ответ дан 23 July 2018 в 18:33

Предполагая, что ваш список файлов является одним именем файла в каждой строке, утилита xargs должна иметь возможность обрабатывать имена файлов с пробелами в них, если вы указываете новую строку как разделительный символ, например

xargs -d '\n' file < filelist.txt

Если вы предпочитают использовать функцию оболочки

while IFS= read -r f; do [[ -z "$f" ]] || file "$f"; done < filelist.txt
9
ответ дан 23 July 2018 в 18:33

Другие вопросы по тегам:

Похожие вопросы: