при чтении с пробелами в именах файлов - PullRequest
0 голосов
/ 29 апреля 2018

На этом .ogg файлах

$ tree
.
├── Disc 1 - 01 - Procrastination.ogg
├── Disc 1 - 02 - À carreaux !.ogg
├── Disc 1 - 03 - Météo marine.ogg
└── mp3

Я пытаюсь с помощью цикла while преобразовать ffmpeg в mp3, оставляя пробелы в именах файлов: *

$ ls *.ogg | while read line; do ffmpeg -i "$line" mp3/"$line".mp3 ; done

Но я получаю эту ошибку ::

$ ls *.ogg | while read line; do ffmpeg -i "$line" mp3/"$line".mp3 ; done
...
Parse error, at least 3 arguments were expected, only 0 given
in string ' 1 - 02 - À carreaux !.ogg' ...
...

Этот отчет bash ffmpeg find и пробелы в именах файлов , даже если он выглядит похожим, для более сложного сценария и не имеет ответа.

Этот ffmpeg не работает с именами файлов с пробелами исправляет это только тогда, когда выводом является http: // URL

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Вам не нужен цикл здесь; пусть find выполнит команду за вас.

find . -type f -name '*.ogg' -exec ffmpeg -i {} mp3/{}.mp3 \;

Или, если вы хотите удалить расширение .ogg из результата:

find . -type f -name '*.ogg' -exec sh -c 'ffmpeg -i "$1" mp3/"${1%.ogg}.mp3"' _ {} \;

И наоборот, вы можете вообще пропустить find:

shopt -s extglob
for f in **/*.ogg; do
  [[ -f $f ]] || continue
  ffmpeg -i  "$f" mp3/"${f%.ogg}.mp3"
done
0 голосов
/ 29 апреля 2018

Используйте find -print0 для получения списка файлов, разделенных NUL, вместо анализа ls, что никогда не было хорошей идеей:

#!/bin/bash

while read -d '' -r file; do
  ffmpeg -i "$file" mp3/"$file".mp3 </dev/null
done < <(find . -type f -name '*.ogg' -print0)

Вы также можете использовать простой глобус:

shopt -s nullglob # make glob expand to nothing in case there are no matching files
for file in *.ogg; do
  ffmpeg -i "$file" mp3/"$file".mp3
done

См:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...