如何使用 GNU xargs 执行 find 来遍历一组目录?

如何使用 GNU xargs 执行 find 来遍历一组目录?
$ echo {a,b,c}.h d e.h |xargs -IA find A -name '*.h'
find: `a.h b.h c.h d e.h': No such file or directory
$ echo -e a.h\\nb.h c.h d e.h |xargs -IA find A -name '*.h'
a.h
find: `b.h c.h d e.h': No such file or directory

问题是这-I意味着 xargs 会假设参数由换行符分隔。我不确定这是为什么。我想我可以用 sed 解决这个问题,但我想知道是否有我不熟悉的 xargs 技巧或习语可以解决这个问题。

我正在寻找一种在 OS X 上也能工作的解决方案。在 OS X 上,xargs -J 开关似乎工作正常。手册页声称此开关将仅控制可执行文件的参数放置位置 - 这正是我想要的。

答案1

嗯。你呢?需要管道和 xargs?看来您的示例真正需要的只是findecho

我猜这是一个更大的难题的一部分,所以这可能不适用于你正在做的事情,但你的例子可以写成:

$ find `echo {a,b,c}.h d e.h` -name '*.h'

$ find $(echo {a,b,c}.h d e.h) -name '*.h'

...在我的系统上,这将导致find单独检查每个参数:

find: `a.h': No such file or directory
find: `b.h': No such file or directory
find: `c.h': No such file or directory
find: `d': No such file or directory
find: `e.h': No such file or directory

我没有 OSX 机器可供测试,并且这些可能是特定于 bash 的。

答案2

为什么不只是find {a,b,c}.h d e.h -name '*.h'

答案3

您是否尝试过 xargs 的 -d 选项?

justin@eee:~$ echo {a,b,c}.h d e.h |xargs -d ' ' -n1  -IA echo foo A
foo a.h
foo b.h
foo c.h
foo d
foo e.h

或者更简单,

justin@eee:~$ for x in $(echo {a,b,c}.h d e.h);do echo foo $x;done
foo a.h
foo b.h
foo c.h
foo d
foo e.h

答案4

使用 GNU Parallel:

parallel -q find {} -name '*.h' ::: {a,b,c}.h d e.h

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

相关内容