9

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

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

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

但结果是一样的,

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

我应该怎么办 ?

4

3 回答 3

17

这就是您要查找的内容:

find . -name "*.csv" -exec sh -c 'echo $(basename "$1")' sh {}  \;
于 2012-12-12T07:27:31.393 回答
0

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

find ... -exec bash -c "... $1 ..." subshell {} \;
于 2012-12-12T06:10:30.900 回答
0

@Ignacio's 是严格正确的,虽然偏向于特定的外壳,而不是建议使用 POSIX 标准外壳......

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

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

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

sed '/^[^/]*$/p;s/.*\/\([^/]*\)$/\1/p'
于 2012-12-12T06:35:16.330 回答