Я ищу способ заставить find и xargs (GNUWin32, под Win7, обе программы в версии 4.1) играть вместе с именами файлов, которые содержат пробелы.

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

Да, мне известно о параметре find 's -exec (который будет работать без xargs), я явно не заинтересован в этом, поскольку я хочу запустить 8 параллельных экземпляров lame для пакетной задачи, требующей большого объема вычислений (примерно перекодировать 1800 192 кбит / с аудиокниг mp3, чтобы они поместились на карту micro-sd моего плеера). То есть xargs -P 8 .

Эта команда:

find . -name "*.mp3" -printf "\"%P\" --abr 52 -q 0 --silent \"conv/%P\" " | xargs -n 7

выведет что-то похожее на:

path/01.01 foo bar.mp3 --abr 52 -q 0 --silent conv/path/path/01.01 foo bar.mp3

... в котором по-прежнему отсутствуют кавычки, поэтому, если я поставлю lame в конце этой команды, он будет рассматривать path/01.01 как input, foo как output и жаловаться на наличие лишнего аргумента bar.mp3 .

  • Я попытался добавить апострофы (вокруг кавычек и внутри них), но `xargs 'также удаляет их.
  • -print0 тоже не подойдет (по крайней мере, для всего, что я пробовал).
  • Я пытался симулировать -print0 с printf и \0 , но безрезультатно.
  • Тем временем я играю с идеей перенаправить вывод в файл и добавить кавычки с помощью текстового редактора ...

2 ответа2

1

Рекомендуемое использование:

find ... -print0 | xargs -0 ...

... если вы говорите -print0 для поиска, то вам нужно -0 для xargs.

Что бы это ни стоило, я часто нахожу xargs неприятностью - в этих случаях я стараюсь создавать точные команды, которые я хочу выполнить, с помощью команды find -printf а затем, наконец, добавить | bash к нему.

0

Если будущему читателю нужно решение, которое работает на CygWin с GNU Parallel:

find . -name "*.mp3" | parallel lame {} --abr 52 -q 0 --silent conv/{}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .