如何在find的exec中运行子命令? 例如,如果我只想从完整路径获取文件名并打印它,我会开火,
find ./ -name "*.csv" -exec echo $(basename {}) \;
其中echo是子命令basename的父命令。
但结果与此相同,
find ./ -name "*.csv" -exec echo {} \;
我该怎么办?
答案 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'