2010-11-11 15 views
13

J'essaye de renommer tous les fichiers dans le répertoire courant de sorte que le nom de majuscule soit converti en plus bas. Je suis en train de le faire comme ceci:xargs pour exécuter une chaîne - qu'est-ce que je fais mal?

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

J'ai deux fichiers dans le répertoire, Y et YY -t ajouté pour le débogage et la sortie est:

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

si je l'exercerai eval seul, cela fonctionne et déplace Y à y.

Je sais qu'il existe d'autres façons d'y parvenir, mais j'aimerais bien que cela fonctionne si je le peux! Vive

Répondre

19

eval est un shell builtin command, pas un exécutable autonome. Par conséquent, xargs ne peut pas l'exécuter directement. Vous voulez sans doute:

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

OK, merci - qui fonctionne. Un peu plus que je ne le pensais. –

+5

Réalisé vous n'avez pas besoin de l'eval (ou des 's ') avec cette méthode. donc ls -1 | gawk '{print "mv" $ 0 "" tolower ($ 0)}' | xargs -i -t sh -c "{}" fonctionne aussi bien –

2

Bien que vous cherchez à une solution de xargs, une autre méthode pour effectuer la même chose peut être fait avec tr (en supposant sh/bash/syntaxe ksh):

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

oui, c'est probablement le meilleur - c'est le code similaire d'un collègue, mais divisé sur plusieurs lignes, et en utilisant une variable - qui a suscité la question - pouvez-vous le faire en 1 ligne? J'ai ensuite été distrait en essayant de faire fonctionner xargs –

+0

Oui - ce que j'ai laissé tomber fonctionnera sans modification. Peu importe ce que vous traitez, les points-virgules sont le séparateur d'instructions si vous voulez combiner plusieurs instructions sur une ligne. –

1

Si vos fichiers sont créés par les utilisateurs créatifs, vous verrez les fichiers comme:

My brother's 12" records 

Les solutions à ce jour ne fonctionnent pas sur ce genre de fichiers. Si vous avez installé en parallèle GNU cela fonctionnera (même sur les fichiers avec des noms créatifs):

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

Regarder la vidéo d'intro pour en savoir plus: http://www.youtube.com/watch?v=OpaiGYxkSuQ