Чтобы сконструировать команду из переданных аргументов, можно воспользоваться программой awk. Кратко, идея следующая: воспользоваться возможностями awk по конструированию любых символьных последовательностей, причем эту симольную последовательность выполнить внутри awk-функции system(), которая непосредственно выполняет запуск символьной последовательности на исполнение.
Например:
$ echo dir file1 file2 | awk '{system("mv "$1"/"$2" "$1"/"$3"")}'
То есть, здесь на вход программы awk из стандартного потока подается три строки, разделенные пробелами: "dir", "file1", "file2". Внутри программы awk эти аргументы будут доступны как $1, $2, $3. Используя эти обозначения, можно сконструировать любую команду.
Но! Помимо того, что команду надо сконструировать, ее еще надо выполнить. За выполнение отвечает функция system(), вызываемая внутри команды awk. Однако не все так просто:
Синтаксис awk очень странный. Аргументы $1, $2, $3 надо заключать в двойные кавычки. И саму формируемую строку в вызове функции system() надо писать в двойных кавычках. Если же в самой формируемой команде нужны кавычки, то их надо экранировать. Зато апостроф внутри system() можно писать не экранируя. Возможно, эта ремарка некорректна, и с кавычками в awk(system()) надо управляться по-другому, но практика показывает, что именно такой вариант работает.
Таким образом, в приведенном выше примере будет сформирована строка с командой переименовывания файла:
"mv dir/file1 dir/file2"
И она будет выполнена, так как данная строка заключена в вызов функции system().
Примерно так.