2010-11-11 23 views
13

Estoy tratando de cambiar el nombre de todos los archivos en el directorio actual para que el nombre de mayúscula se convierta en inferior. Estoy tratando de hacerlo de esta manera:xargs para ejecutar una cadena - ¿Qué estoy haciendo mal?

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

Tengo dos archivos en el directorio, Y y YY -t añadido para la depuración, y la salida es:

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

si ejecuto la eval por sí mismo, funciona y mueve Y a y.

Sé que hay otras formas de lograr esto, pero me gustaría hacerlo funcionar si puedo. Saludos

Respuesta

19

eval es una cáscara builtin command, no un ejecutable independiente. Por lo tanto, xargs no puede ejecutarlo directamente. Es probable que desee:

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

Bien, gracias - que funciona. Un poco más de lo que me di cuenta. –

+5

Se dio cuenta de que no necesita la evaluación (o las 's) con este método. entonces ls -1 | gawk '{print "mv" $ 0 "" tolower ($ 0)}' | xargs -i -t sh -c "{}" también funciona –

2

Aunque usted está buscando en una solución xargs, otro método para realizar la misma cosa se puede hacer con tr (suponiendo sh/bash/sintaxis ksh):

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

Sí, probablemente sea el mejor, es el código similar de un colega, pero se divide en varias líneas y usa una variable, lo que provocó la pregunta, ¿puedes hacerlo? en 1 linea? Luego me distrajé tratando de hacer funcionar xargs –

+0

Sí, lo que he dejado caer arriba funcionará sin modificaciones. No importa con qué se trate, los puntos y comas son el separador de declaraciones si desea combinar varias declaraciones en una línea. –

1

Si los archivos son creados por usuarios creativos, verá los archivos como:

My brother's 12" records 

Las soluciones hasta ahora no funcionan en ese tipo de archivos. Si tiene instalado en paralelo GNU esto funcionará (incluso en los archivos con nombres creativos):

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

Mira el vídeo de introducción para aprender más: http://www.youtube.com/watch?v=OpaiGYxkSuQ

Cuestiones relacionadas