我正在尝试重命名当前目录中的所有文件,以便将大写名称转换为较低的名称。我试着这样做:
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。
我知道还有其他方法可以实现这一目标,但如果可以的话,我想让它工作! 干杯
答案 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 {}"