在find -exec选项中输入重定向

时间:2018-01-29 15:19:35

标签: bash redirect find

为什么这个命令不起作用?

find / -type f -name "*.c" -exec wc -c < \{} \;

我正在尝试隐藏文件名,同时显示字符数

3 个答案:

答案 0 :(得分:3)

您可以执行以下操作:

find / -type f -name "*.c" -exec wc -c {} + | awk '{print $1}'

<不起作用,因为重定向适用于find命令本身。因此,您可以使用awk仅打印第一列

正如@Charles Duffy指出的那样,这有点效率,因为这意味着我们只需要启动一个wc进程,而不是每个文件启动一次shell包装器(作为{{1}实例是共享的,不是每个文件调用的)。

答案 1 :(得分:2)

使用bash命令exec,如下所示

find . -type f -name "*.c" -exec bash -c 'wc -c < "$1"' _ {} \;

在您的情况下,重定向<适用于find命令本身,导致语法错误,因为没有文件名为{}

旁注: bash shell中的位置参数应该用双引号来处理非标准的文件名,比如那些带空格的文件名。

修改

NOT 支付调用多个子shell的额外费用,我们可以进一步改进exec部分,如下所示

find . -type f -name "*.c" -exec bash -c 'for arg; do wc -c <"$arg"; done' _ {} +

@Charles Duffy建议提供this

答案 2 :(得分:0)

如果你真的想要重定向,可以在子shell中执行:

find / -type f -name "*.c" -exec sh -c 'wc -c < "{}"' \;

编辑:不要这样做 - 请参阅下面的评论!