【问题标题】:xargs to execute a string - what am I doing wrong?xargs 执行一个字符串 - 我做错了什么?
【发布时间】:2011-05-08 10:25: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。

我知道还有其他方法可以实现这一点,但如果可以的话,我希望能够让它发挥作用! 干杯

【问题讨论】:

    标签: shell eval xargs


    【解决方案1】:

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

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

    【讨论】:

    • 意识到您不需要使用此方法的 eval(或 `s)。所以 -1 | gawk '{print "mv "$0" "tolower($0)}' | xargs -i -t sh -c "{}" 也可以
    • 当来自输出 docker pull xx:sed -n 's/\s*image: \(.*\)/docker pull \1/gp' ../docker-compose.yml |xargs -i -0 -t sh -c "{}" 的 sed 替换时,它对我不起作用。我得到“无效的参考格式”。我还尝试在 xargs 之前加上双引号
    【解决方案2】:

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

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

    【讨论】:

    • 是的,这可能是最好的——它是同事的类似代码,但分成几行,并使用一个变量——提示了这个问题——你能在 1 行中完成吗?然后我因为试图让 xargs 工作而分心
    • 是的——我上面的内容无需修改即可工作。不管你在处理什么,如果你想在一行中合并多个语句,分号是语句分隔符。
    【解决方案3】:

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

    My brother's 12" records
    

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

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

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

    【讨论】:

      【解决方案4】:

      您可以将 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 {}"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-24
        • 1970-01-01
        • 2021-09-27
        • 1970-01-01
        • 2021-09-20
        • 1970-01-01
        • 2015-05-31
        相关资源
        最近更新 更多