如何在find exec中运行子命令

时间:2012-12-12 06:08:00

标签: shell

如何在find的exec中运行子命令? 例如,如果我只想从完整路径获取文件名并打印它,我会开火,

find ./ -name "*.csv" -exec echo $(basename {}) \;

其中echo是子命令basename的父命令。

但结果与此相同,

find ./ -name "*.csv" -exec echo {} \;

我该怎么办?

3 个答案:

答案 0 :(得分:12)

这就是你要找的东西:

find . -name "*.csv" -exec sh -c 'echo $(basename "$1")' sh {}  \;

答案 1 :(得分:0)

与往常一样,调用shell来运行它。

find ... -exec bash -c "... $1 ..." subshell {} \;

答案 2 :(得分:0)

@ Ignacio是严格正确的,albiet偏向于特定的shell,而不是建议使用POSIX标准shell ....

但是,使用过滤器可以更有效地完成您要做的事情。即你试图找到一种方法让find转换它将要打印的每个路径名,但这会导致find为它匹配的每个文件名分叉一个shell进程!

为了提高效率,您应该尝试找到一种方法,将find可能产生的路径名列表转换为您希望看到它们的形式,并且只需要一个额外的流程即可。

例如,如果您想要查看的是每个路径名的基本名称(即最终文件名组件),那么您可以使用(相对)简单的sed命令轻松地执行此操作,您可以管道find 1}}输出以生成所需的文件名列表:

sed '/^[^/]*$/p;s/.*\/\([^/]*\)$/\1/p'