当前位置:  开发笔记 > 编程语言 > 正文

如果stdin输入为空,如何忽略xargs命令?

如何解决《如果stdin输入为空,如何忽略xargs命令?》经验,为你挑选了4个好方法。

考虑这个命令:

ls /mydir/*.txt | xargs chown root

目的是将所有文本文件的所有者更改mydir为root

问题是,如果没有.txt文件,mydir则xargs会发出一条错误,指出没有指定路径.这是一个无害的例子,因为被抛出一个错误,但在某些情况下,如在我需要在这里使用的脚本,假设一个空白的路径是当前目录.因此,如果我/home/tom/从那时起运行该命令,如果没有结果,ls /mydir/*.txt并且所有文件/home/tom/都将其所有者更改为root.

那么我如何让xargs忽略空结果呢?



1> Sven Marnach..:

对于GNU xargs,您可以使用-r--no-run-if-empty选项:

--no-run-if-empty
-r
如果标准输入不包含任何非空白,请不要运行该命令.通常,即使没有输入,命令也会运行一次.此选项是GNU扩展.


不幸的是,这不适用于Mac.既不是短期也不是长期期权.
老实说,我先在谷歌搜索并找到了这个(但不会在没有阅读手册的情况下提出要求).我有点认为这应该是默认行为,不需要开关来启用它.
@wedi - OSX有BSD用户空间,所以这种事情会经常发生.您可以使用自制程序来安装GNU fileutils来解决它.
你的意思是'brew install findutils`.`findutils`,而不是`fileutils`.
在macOS上,不提供标志会导致始终无法运行命令,因此我猜想它是不需要的。

2> arielCo..:

非GNU的xargs用户可以利用的-L <#lines>,-n <#args>,-i,和-I :

ls /empty_dir/ | xargs -n10 chown root # chown executed every 10 args or fewer
ls /empty_dir/ | xargs -L10 chown root # chown executed every 10 lines or fewer
ls /empty_dir/ | xargs -i cp {} {}.bak # every {} is replaced with the args from one input line
ls /empty_dir/ | xargs -I ARG cp ARG ARG.bak # like -i, with a user-specified placeholder

请记住,xargs在空白处拆分行,但引用和转义是可用的; RTFM了解详情.


是! 在MAC OSX上,`echo''| xargs -n1 echo blah`什么都不做; 而`echo'x'| xargs -n1 echo blah`打印"blah".
似乎没有回答这个问题?
@Nicolas:如果您的`xargs`版本不支持`--no-run-if-empty`开关并尝试在没有STDIN输入的情况下运行命令参数,那么这是防止执行的方法(在Solaris 10中就是这种情况) ).其他unix中的版本可能只是忽略空列表(例如AIX).
对于GNU和BSD/OSX支持,我最终使用的东西:`ls /mydir/*.txt | xargs -n 1 -I {} chown root {}`,正如这个答案所暗示的那样.

3> thiton..:

man xargs--no-run-if-empty.



4> kenorb..:

xargs你而言,你可以-r按照建议使用,但BSD不支持它xargs.

因此,作为解决方法,您可以传递一些额外的临时文件,例如:

find /mydir -type f -name "*.txt" -print0 | xargs -0 chown root $(mktemp)

或者将其stderr重定向到null(2> /dev/null),例如

find /mydir -type f -name "*.txt" -print0 | xargs -0 chown root 2> /dev/null || true

另一种更好的方法是使用while循环迭代找到的文件:

find /mydir -type f -name "*.txt" -print0 | while IFS= read -r -d '' file; do
  chown -v root "$file"
done

另请参阅:在Mac OS X中忽略xargs的空结果


另请注意,您更改权限的方法并不好,不鼓励使用.当然你不应该解析ls命令的输出(参见:为什么你不应该解析ls的输出).特别是当您通过root运行命令时,因为您的文件可以包含可由shell解释的特殊字符,或者想象具有空格字符的文件/,那么结果可能很糟糕.

因此,您应该改变您的方法并使用find命令,例如

find /mydir -type f -name "*.txt" -execdir chown root {} ';'

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有