18

我正在尝试重命名当前目录中的所有文件,以便将大写名称转换为小写。我正在尝试这样做:

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

4 回答 4

27

eval是一个 shell内置命令,而不是一个独立的可执行文件。因此,xargs不能直接运行它。你可能想要:

ls -1 | gawk '{print "`mv "$0" "tolower($0)"`"}' | xargs -i -t sh -c "{}"
于 2010-11-11T12:28:38.220 回答
4

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

for i in *; do mv $i `echo $i | tr '[A-Z]' '[a-z]'`; done
于 2010-11-11T12:44:38.317 回答
1

如果您的文件是由有创意的用户创建的,您将看到如下文件:

My brother's 12" records

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

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

观看介绍视频以了解更多信息:http ://www.youtube.com/watch?v=OpaiGYxkSuQ

于 2011-01-09T21:59:14.827 回答
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 {}"
于 2021-05-11T06:56:35.327 回答