Ответ 1
eval является оболочкой встроенной командой, а не автономный исполняемый файл. Таким образом, xargs
не может запускать его напрямую. Вероятно, вы хотите:
ls -1 | gawk '{print "`mv "$0" "tolower($0)"`"}' | xargs -i -t sh -c "{}"
Я пытаюсь переименовать все файлы в текущем каталоге, чтобы имя верхнего регистра было преобразовано в нижнее. Я пытаюсь сделать это вот так:
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.
Я знаю, что есть другие способы добиться этого, но я бы хотел, чтобы это работало, если можно! Приветствия
eval является оболочкой встроенной командой, а не автономный исполняемый файл. Таким образом, xargs
не может запускать его напрямую. Вероятно, вы хотите:
ls -1 | gawk '{print "`mv "$0" "tolower($0)"`"}' | xargs -i -t sh -c "{}"
Хотя вы смотрите на решение xargs, другой способ выполнить одно и то же можно сделать с помощью tr
(предполагая синтаксис sh/bash/ksh):
for i in *; do mv $i `echo $i | tr '[A-Z]' '[a-z]'`; done
Если ваши файлы создаются креативными пользователями, вы увидите такие файлы, как:
My brother 12" records
Решения до сих пор не работают над такими файлами. Если у вас установлен GNU Parallel, это будет работать (даже в файлах с именами объявлений):
ls | parallel 'mv {} "$(echo {} | tr "[:upper:]" "[:lower:]")"'
Смотрите видеоролик, чтобы узнать больше: http://www.youtube.com/watch?v=OpaiGYxkSuQ