如何在 find 的 exec 中运行子命令?例如,如果我只想从完整路径中获取文件名并打印它,我会开火,
find ./ -name "*.csv" -exec echo $(basename {}) \;
其中 echo 是子命令 basename 的父命令。
但结果是一样的,
find ./ -name "*.csv" -exec echo {} \;
我应该怎么办 ?
如何在 find 的 exec 中运行子命令?例如,如果我只想从完整路径中获取文件名并打印它,我会开火,
find ./ -name "*.csv" -exec echo $(basename {}) \;
其中 echo 是子命令 basename 的父命令。
但结果是一样的,
find ./ -name "*.csv" -exec echo {} \;
我应该怎么办 ?
这就是您要查找的内容:
find . -name "*.csv" -exec sh -c 'echo $(basename "$1")' sh {} \;
与往常一样,调用一个 shell 来运行它。
find ... -exec bash -c "... $1 ..." subshell {} \;
@Ignacio's 是严格正确的,虽然偏向于特定的外壳,而不是建议使用 POSIX 标准外壳......
但是,您尝试做的事情是使用过滤器更有效地完成。即,您正试图找到一种方法来find
转换它将要打印的每个路径名,但这会导致 find 为它匹配的每个文件名派生一个 shell 进程!
为了提高效率,您应该尝试找到一种方法,将find
可能产生的路径名列表转换为您希望在其中看到它们的形式,并且只需要一个额外的过程即可。
例如,如果您只想看到每个路径名的基本名称(即最终文件名组件),那么您可以使用(相对)简单的sed
命令轻松完成此操作,您可以find
通过管道输出以生成所需的文件名列表:
sed '/^[^/]*$/p;s/.*\/\([^/]*\)$/\1/p'