Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在find-exec选项中输入重定向_Bash_Redirect_Find - Fatal编程技术网

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

Bash 在find-exec选项中输入重定向,bash,redirect,find,Bash,Redirect,Find,为什么这个命令不起作用 find / -type f -name "*.c" -exec wc -c < \{} \; find/-type f-name“*.c”-exec wc-c

为什么这个命令不起作用

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

我试图在显示字符数时隐藏文件名。您可以执行以下操作:

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


将bash命令与
exec
一起使用,如下所示

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

礼貌的建议



如果您确实想要重定向,可以在子shell中执行:

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

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

这比目前发布的其他解决方案要有效一些,因为这意味着我们只启动一个
wc
进程,并且没有shell包装,每个文件只启动一次(因为
awk
实例是共享的,而不是每个文件调用的)。也就是说,您可以使用
-exec wc-c{}+
进一步改进它,要将多个文件名传递给
wc
@CharlesDuffy的每个实例,请添加它!我会考虑<代码> -Primt0,而IFS = Read -R-D的名称;对arg执行wc-c或
-execbash-c';做wc-c@CharlesDuffy很棒的建议。。我接受第二个建议来编辑我的答案…-)将
{}
放在传递给
-c
的参数中会导致安全漏洞。如果有人将使用
touch'$(rm-rf~).c'
创建的文件检查到您正在运行此操作的代码库中,您将度过非常糟糕的一天。如sjsam的回答所示,将其传递到带外更安全。(此外,
find
的POSIX标准不能保证如果它是一个子串而不是整个参数,那么它将被替换。
{}
。在通用实现上工作,包括GNU和BSD,但在旧的或小型嵌入式系统上可能会有问题)@sjsam,对——有些人尝试使用单引号,但攻击者在文件名中使用文字单引号很容易反击(考虑
touch$'$(rm-rf~)\'$(rm-rf~)\'.c'
,创建一个双向攻击)。将数据从代码中带出是正确的方法。@Tom,那里的测试用例要求您有一个名为
$(rm
的目录,在其中创建子目录
tmp
,并在其中创建名为
test).c的文件。我的示例没有斜杠是有原因的。考虑<代码>触摸$$(触摸pWnD)\ $(触摸pWnD)\c' 如果您不想麻烦创建一些奇怪命名的目录。@汤姆,…或,对于您的原始测试用例:<代码> MKDIR -P’$(RM/TMP’& & Touch $(RM/TMP/测试)。C’< /代码>(不需要使用
$'
语法,因为我们没有在名称中使用文字单引号)。