Я относительно новичок в Bash и пытаюсь сделать что-то, что на первый взгляд кажется довольно простым - запустите find по иерархии каталогов, чтобы получить все файлы * .wma, канал, который выводит команду, где я конвертирую их в mp3 и сохраните преобразованный файл как .mp3. Я думал, что команда должна выглядеть следующим образом (я перестал использовать команду преобразования звука и вместо этого использую echo для иллюстрации):
$ find ./ -name '*.wma' -type f -print0 | xargs -0 -I f echo ${f%.*}.mp3
Насколько я понимаю, аргумент -print0 позволит мне обрабатывать имена файлов с пробелами (что многие из них делают, поскольку они являются музыкальными файлами). Затем я ожидаю (в результате xargs), что каждый путь к файлу из find будет записан в f, и что с использованием совпадения / удаления подстроки в конце строки, что я должен повторить исходный путь к файлу с mp3 расширение вместо WMA. Однако вместо этого результата я вижу следующее:
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
...
Таким образом, мой вопрос (помимо конкретного «что я здесь делаю неправильно») заключается в следующем: нужно ли обрабатывать значения, являющиеся результатом операции конвейера, в операциях манипуляции со строками иначе, чем значения, которые являются результатом присваивания переменной ?
{}
члена)
xargs
это более подходит, чем exec
. См. Этот столбец стека stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs для конкретного случая.
xargs
сfind
. Он поставляется с-exec
опцией. Вы можете просто добавить команду, которую собираетесь использовать, к своему вопросу, и кто-то может показать вам правильнуюfind
команду?