Shell 在find--exec中传输多个命令

Shell 在find--exec中传输多个命令,shell,find,Shell,Find,在shell中,我想列出与特定文件名模式匹配的每个文件的行数。我的方法是使用find来选择文件,使用-exec cat{}来打印它们,并使用|wc-l来计算行数 find . -type f -name 'priceupdate*csv' -print0 -exec cat {} \; 打印所有内容,但 find . -type f -name 'priceupdate*csv' -print0 -exec cat {}|wc -l \; 警报 wc: ';'find: missing ar

在shell中,我想列出与特定文件名模式匹配的每个文件的行数。我的方法是使用
find
来选择文件,使用
-exec cat{}
来打印它们,并使用
|wc-l
来计算行数

find . -type f -name 'priceupdate*csv' -print0 -exec cat {} \;
打印所有内容,但

find . -type f -name 'priceupdate*csv' -print0 -exec cat {}|wc -l \;
警报

wc: ';'find: missing argument to `-exec'

谢谢

您可以使用
xargs

find . -type f -name 'priceupdate*csv' -print0 | xargs -0 wc -l
或者你可以这样做:

find . -type f -name 'priceupdate*csv' -exec wc -l {} +

您可以使用
xargs

find . -type f -name 'priceupdate*csv' -print0 | xargs -0 wc -l
或者你可以这样做:

find . -type f -name 'priceupdate*csv' -exec wc -l {} +

exec
使用其参数运行单个命令,而不是任意shell命令。为此,需要显式运行shell

find . -type f -name 'priceupdate*csv' -print0 -exec sh -c  'cat "$1" |wc -l' _ {} \;
作为一般规则,最好将
{}
的扩展作为参数传递,而不是尝试将其直接合并到命令中,以避免shell解析带来的意外


(我的回答仅限于问题本身,而不是涉及实际shell命令的各种问题。)

exec
使用参数运行单个命令,而不是任意shell命令。为此,需要显式运行shell

find . -type f -name 'priceupdate*csv' -print0 -exec sh -c  'cat "$1" |wc -l' _ {} \;
作为一般规则,最好将
{}
的扩展作为参数传递,而不是尝试将其直接合并到命令中,以避免shell解析带来的意外


(我将此答案限制在所问的问题上,而不是涉及实际shell命令的各种问题。)

您希望一次(或)单独计算所有cat ed文件完整内容的行数读者练习:解释为什么
find-f型-exec wc-l<{}\
无法计算当前目录中(及以下)每个文件的行数。重新阅读问题后,
wc-l priceupdate*.csv
?@MarkSetchell将显示每个文件的行数,而不是总行数…这可能是您的意图。我不是100%清楚。您想要一次(或)单独计算所有cat ed文件完整内容的行数。读者练习:解释为什么
find-f型-exec wc-l<{}\
无法计算当前目录中(及以下)每个文件的行数。重新阅读问题后,
wc-l priceupdate*.csv
?@MarkSetchell将显示每个文件的行数,而不是总行数…这可能是您的意图。我不是100%清楚,谢谢。你能解释一下结尾的下划线吗?这是一个伪参数。要执行的字符串后面的第一个位置参数用于在该shell中设置
$0
,但您很少关心它的值是什么
{}
则用于在shell中设置
$1
。谢谢。你能解释一下结尾的下划线吗?这是一个伪参数。要执行的字符串后面的第一个位置参数用于在该shell中设置
$0
,但您很少关心它的值是什么
{}
用于在shell中设置
$1