xargs для выполнения строки - что я делаю не так? - PullRequest
14 голосов
/ 11 ноября 2010

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

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.

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

Ответы [ 3 ]

21 голосов
/ 11 ноября 2010

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

ls -1 | gawk '{print "`mv "$0" "tolower($0)"`"}' | xargs -i -t sh -c "{}"
2 голосов
/ 11 ноября 2010

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

for i in *; do mv $i `echo $i | tr '[A-Z]' '[a-z]'`; done
1 голос
/ 10 января 2011

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

My brother's 12" records

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

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

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

...