Xargs для выполнения строки - что я делаю неправильно?

Я пытаюсь переименовать все файлы в текущем каталоге, чтобы имя верхнего регистра было преобразовано в нижнее. Я пытаюсь сделать это вот так:

ls -1|gawk '{print "`mv "$0" "tolower($0)"`"}'|xargs -i -t eval {}

У меня есть два файла в каталоге: Y и YY -t добавлен для отладки, а вывод:

eval `mv Y y`
xargs: eval: No such file or directory

если я сам выполнил eval, он работает и перемещает Y в y.

Я знаю, что есть другие способы добиться этого, но я бы хотел, чтобы это работало, если можно! Приветствия

Ответы

Ответ 1

eval является оболочкой встроенной командой, а не автономный исполняемый файл. Таким образом, xargs не может запускать его напрямую. Вероятно, вы хотите:

ls -1 | gawk '{print "`mv "$0" "tolower($0)"`"}' | xargs -i -t sh -c "{}"

Ответ 2

Хотя вы смотрите на решение xargs, другой способ выполнить одно и то же можно сделать с помощью tr (предполагая синтаксис sh/bash/ksh):

for i in *; do mv $i `echo $i | tr '[A-Z]' '[a-z]'`; done

Ответ 3

Если ваши файлы создаются креативными пользователями, вы увидите такие файлы, как:

My brother 12" records

Решения до сих пор не работают над такими файлами. Если у вас установлен GNU Parallel, это будет работать (даже в файлах с именами объявлений):

ls | parallel 'mv {} "$(echo {} | tr "[:upper:]" "[:lower:]")"'

Смотрите видеоролик, чтобы узнать больше: http://www.youtube.com/watch?v=OpaiGYxkSuQ