shell脚本中的xargs


2

我想用奇数和偶数组合jpeg图像。所以我喜欢以下内容:

$ mkdir odd
$ mkdir even
$ find . -regextype posix-egrep -regex ".*[13579].jpg$" -print0 | xargs -i -0 mv {} odd/
$ find . -regextype posix-egrep -regex ".*[02468].jpg$" -print0 | xargs -i -0 mv {} even/

它工作正常。我在shell脚本中写了同样的东西。

#!/bin/bash
mkdir odd
mkdir even
find . -regextype posix-egrep -regex ".*[13579].jpg$" -print0 | xargs -i -0 mv {} odd/
find . -regextype posix-egrep -regex ".*[02468].jpg$" -print0 | xargs -i -0 mv {} even/

但它返回以下错误:

xargs: Warning: a NUL character occurred in the input.  It cannot be passed through in the argument list.  Did you mean to use the --null option?

为什么这个脚本不起作用?以及如何解决它?


1
不确定你当前的脚本是做什么的,但你可以通过在-exec选项中执行find来简化命令并完全删除xargs - 所以'find。-regextype posix-egrep -regex“。* [13579] .jpg $” - exec mv {} odd / \;' 会为你做第一线。
davidgo 2013年

我想知道“-i”是否是你的问题的原因 - 根据xargs用于替换函数,并且可能试图替换空字符。这并不能解释为什么你在那里使用它,或者为什么它在命令行上运行而不是脚本。我很想知道是否删除-i适合你。
davidgo 2013年

谢谢davidgo!它适用于-exec选项。但是如果我在xargs中删除-i选项,我就无法工作。我添加了该-i选项,因为我想{}在xargs参数中使用表达式。没必要吗?
铁杆和2013年

Answers:


0

一个可能的来源是您可能有两个不同版本的xargs具有不同选项语法,并且由于$ PATH中的差异,脚本使用的是与交互式会话不同的版本。你可以通过编写另一个脚本来查看它找到的版本,从而非常容易地检查它:

#!/bin/bash
echo "xargs is: $(which xargs)"
echo "PATH is: $PATH"

...查看脚本打印的内容,然后以which xargs交互方式运行相同的命令(或只是),看看是否得到了不同的结果。如果它们出现不同,那么你的shell初始化脚本(〜/ .bashrc,〜/ .bash_profile等)可能会引发它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.