В случае Вашей оценки решения ${f%.*}.mp3 сделан в оболочке, что Вы вызываете целую команду в, не в оболочке, разветвленной xargs. И в Вашей оболочке нет никакой f переменной, ею заменяет пустая строка.
Решение с помощью xargs с-I f:
% cat 1.sh
#!/bin/sh
f=$1
echo ${f%.*}.mp3
% /bin/ls -1
1.sh
aaa.wma
bbbb.wma
ccccc.wma
% find ./ -name '*.wma' -type f -print0 | xargs -0 -I f ./1.sh f
./aaa.mp3
./ccccc.mp3
./bbbb.mp3
Но я сделал бы это этот путь:
% find ./ -name '*.wma' -type f | sed 's,\.wma$,.mp3,'
Необходимо сделать это исполняемым файлом с chmod a+x run.sh
и затем попробуйте еще раз.
Это сделает исполняемый файл файла.
Наиболее вероятно, что кто-то еще упомянул, в котором файл не является исполняемым файлом. Иногда, это - что-то еще.
Если хижина (#!/bin/sh
или эквивалентный), является неправильным, я видел отчет об оболочке file not found
или command not found
даже при том, что это - там исполняемый файл. Когда я видел его, это был случай сценария жемчуга, который имел #!/usr/local/bin/perl
когда perl
был в/usr/bin.
Просто изображенный я добавил бы эту другую потенциальную причину.