2010-11-11 5 views
13

Ich versuche, alle Dateien im aktuellen Verzeichnis umzubenennen, so dass der Name in Großbuchstaben in niedrigere konvertiert wird. Ich versuche, es so zu tun:xargs zum Ausführen einer Zeichenfolge - was mache ich falsch?

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

Ich habe zwei Dateien in dem Verzeichnis, Y und YY -t für das Debuggen hinzugefügt und ausgegeben wird:

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

wenn ich die execute eval allein, es funktioniert und bewegt Y zu y.

Ich weiß, dass es andere Möglichkeiten gibt, dies zu erreichen, aber ich würde gerne funktionieren, wenn ich kann! Cheers

Antwort

19

eval ist eine Shell builtin command, keine eigenständige ausführbare Datei. Daher kann xargs es nicht direkt ausführen. Sie wollen wahrscheinlich:

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

OK, danke - das funktioniert. Ein bisschen mehr, als mir klar war. –

+5

Realisiert, dass Sie das Eval (oder das 's) mit dieser Methode nicht benötigen. also ls -1 | gawk '{print "mv" $ 0 "" tolower ($ 0)}} | xargs -i -t sh -c "{}" funktioniert auch –

2

Obwohl Sie bei einer xargs Lösung suchen, eine andere Methode, um die gleiche Sache durchführen kann mit tr (unter der Annahme sh/bash/KSH Syntax) durchgeführt werden wenn Sie Ihre Dateien durch kreative Benutzer erstellt werden, sehen Sie Dateien wie:

My brother's 12" records 

Die Lösungen bisher nicht auf diese Art von Dateien zu arbeiten. Wenn Sie GNU Parallel dies installiert (auch mit kreativen Namen auf die Dateien) funktioniert:

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

Sehen Sie das Intro-Video mehr erfahren: http://www.youtube.com/watch?v=OpaiGYxkSuQ

+0

Ja, das ist wahrscheinlich das beste - es ist ein ähnlicher Code eines Kollegen, aber über mehrere Zeilen aufgeteilt, und mit einer Variablen - die die Frage ausgelöst - können Sie es tun in 1 Zeile? Ich wurde dann abgelenkt, indem ich versuchte, xargs zur Arbeit zu bekommen –

+0

Yep - was ich oben fallen gelassen habe, funktioniert ohne Änderung. Ganz gleich, um was es sich handelt, Semikolons sind das Trennzeichen für Anweisungen, wenn Sie mehrere Anweisungen in einer Zeile kombinieren möchten. –

1

:

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