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