Shell 在find--exec中传输多个命令
在shell中,我想列出与特定文件名模式匹配的每个文件的行数。我的方法是使用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
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
。