为什么这个命令不起作用?
find / -type f -name "*.c" -exec wc -c < \{} \;
我正在尝试隐藏文件名,同时显示字符数
答案 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 < "{}"' \;
编辑:不要这样做 - 请参阅下面的评论!