xargs: незавершенная цитата

Я пытаюсь преобразовать некоторые файлы .flac в .mp3, которые можно импортировать в iTunes. Я пробовал с find, xargs и ffmpeg, но xargs выдает мне ошибку незавершенной цитаты (потому что у меня есть кавычки в имени файла).

Это моя командная строка:

MacKassner:Geto Boys kassner$ find . -type f | egrep "\.flac$" | xargs -I {} ffmpeg -i {} -ab 192k -acodec libmp3lame -ac 2 {}.mp3

Это останавливает и вызывает ошибку в имени файла "Talkin 'Loud Ain't Saying Nothin'.flac".

Какие уловки, чтобы заставить это работать?

- Решил только найти - найти. -type f -name "* .flac" -exec ffmpeg -i {} -ab 192k -acodec libmp3lame -ac 2 {} .mp3 \;


person Rafael Kassner    schedule 18.02.2011    source источник


Ответы (3)


Используйте GNU Parallel. Он специально создан для этой цели:

MacKassner:Geto Boys kassner$ find . -type f | egrep "\.flac$" | parallel ffmpeg -i {} -ab 192k -acodec libmp3lame -ac 2 {}.mp3

Вы также можете использовать {.}. Mp3, чтобы избавиться от файла .flac:

MacKassner:Geto Boys kassner$ find . -type f | egrep "\.flac$" | parallel ffmpeg -i {} -ab 192k -acodec libmp3lame -ac 2 {.}.mp3

Посмотрите вступительное видео, чтобы узнать больше: http://www.youtube.com/watch?v=OpaiGYxkSuQ

person Ole Tange    schedule 20.02.2011
comment
Теперь убедитесь, что это можно сделать в 2011 году: теперь можно получить параллель из homebrew: homebrew install parallel. - person Anthony Pulido; 15.04.2018

Некоторые версии xargs поддерживают настраиваемый разделитель. Если это так, то это так же просто, как добавить -d'\n', чтобы указать, что символ новой строки должен использоваться для разделения элементов (что обычно имеет смысл).

В этом случае вы бы использовали его следующим образом:

# find files_containing_quotes/ | xargs -d'\n' -i{} echo "got item '{}'"
person Ian    schedule 13.09.2013
comment
Жаль, что xargs на OSX не поддерживает его. В любом случае спасибо за подсказку, я не знал аргумента -d. - person Rafael Kassner; 14.09.2013

Из справочной страницы egrep:

-Z, --null
          Output  a  zero  byte  (the  ASCII NUL character) instead of the character that normally follows a file
          name.  For example, grep -lZ outputs a zero byte after each file name instead  of  the  usual  newline.
          This  option  makes  the  output  unambiguous,  even  in  the presence of file names containing unusual
          characters like newlines.  This option can be used with commands like find -print0, perl -0,  sort  -z,
          and xargs -0 to process arbitrary file names, even those that contain newline characters.

Поэтому используйте -Z с egrep и -0 с xargs

person Satya    schedule 18.02.2011
comment
egrep с -Z работает как шарм, но xargs с -I и -0 шутит. Маккасснер: Geto Boys, касснер $ найди. | egrep -Z \ .flac $ | xargs -0 -I {} echo {} И это печатает {} один раз. - person Rafael Kassner; 18.02.2011