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

问题描述 投票:0回答:5

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

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。

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

shell eval xargs
5个回答
29
投票

eval 是一个 shell 内置命令,而不是独立的可执行文件。因此,

xargs
无法直接运行它。您可能想要:

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

4
投票

虽然您正在寻找 xargs 解决方案,但可以使用

tr
完成执行相同操作的另一种方法(假设 sh/bash/ksh 语法):

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

1
投票

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

My brother's 12" records

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

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

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


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 {}"

0
投票

for
循环帮助了其他人,所以我想我会展示如何直接在
awk
中执行此操作:

➜  $ touch E F G H I                             
➜  $ ls -1 | gawk '{system("mv " $0 " " tolower($0))}'
➜  $ ls
e  f  g  h  i
© www.soinside.com 2019 - 2024. All rights reserved.