xargs执行一个字符串 - 我做错了什么?

时间:2010-11-11 11:53:26

标签: shell eval 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。

我知道还有其他方法可以实现这一目标,但如果可以的话,我想让它工作! 干杯

4 个答案:

答案 0 :(得分:21)

eval是一个shell builtin command,而不是一个独立的可执行文件。因此,xargs无法直接运行它。你可能想要:

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

答案 1 :(得分:2)

虽然您正在查看xargs解决方案,但可以使用tr执行相同操作的另一种方法(假设使用sh / bash / ksh语法):

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

答案 2 :(得分:1)

如果您的文件是由广告素材用户创建的,则会看到以下文件:

My brother's 12" records

到目前为止,解决方案不适用于那种文件。如果您安装了GNU Parallel,这将起作用(即使在具有创意名称的文件上):

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

观看介绍视频以了解详情:http://www.youtube.com/watch?v=OpaiGYxkSuQ

答案 3 :(得分:0)

您可以将 eval 与 xargs 一起使用,如下所示。

注意:我只在 bash shell 中测试过这个

ls -1| gawk '{print "mv "$0" /tmp/"toupper($0)""}'| xargs -I {} sh -c "eval {}"

ls -1| gawk '{print "mv "$0" /tmp/"toupper($0)""}'| xargs -I random_var_name sh -c "eval random_var_name"

当我想避免单行 for 循环时,我通常使用这种方法。

例如

for file in $(find /some/path | grep "pattern");do somecmd $file; done

同样可以写成如下

find /some/path | grep "pattern"| xargs -I {} sh -c "somecmd {}"