2010-11-11 2 views
13

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

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

ответ

19

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

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

ОК, спасибо - это работает. Это немного больше, чем я понял. –

+5

Понял, что вам не нужен eval (или 's) с помощью этого метода. поэтому ls -1 | gawk '{print "mv" $ 0 "" tolower ($ 0)}' | xargs -i -t sh -c "{}" работает также –

2

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

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

да, это, наверное, лучший - это аналогичный код коллеги, но разбился на несколько строк и с помощью переменной - которая вызвала вопрос - можете ли вы это сделать в 1 строке? Затем я отвлекся, пытаясь заставить xargs работать –

+0

Yep - то, что я упал выше, будет работать без изменений. Независимо от того, с чем вы имеете дело, полуколоны - это разделитель операторов, если вы хотите объединить несколько операторов в одной строке. –

1

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

My brother's 12" records 

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

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

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