如何打印目录中每个文件的最长行号?

时间:2013-04-29 01:11:01

标签: unix escaping find

我正在尝试列出当前目录中文件的最大行长度,但是我的命令工作有问题。我相信在我的exec命令中转义大括号{}是一个问题。在搜索了大量的find exec escape答案之后,我无法找到有关如何在exec命令中转义括号{}的任何内容。我错过了什么?

find . -iname *.page -exec awk '{if(length($0) > L) { LINE=$0;L = length($0)}} 
END {print LINE"|"L}' {}\; | sort

2 个答案:

答案 0 :(得分:1)

你想在每个文件上运行awk,对吧?

在您的主目录中创建一个脚本:t.sh:

awk '{if(length($0) > L) { LINE=$0;L = length($0)}} 
END {print LINE"|"L}' "$1" 

命令行:

find . -iname *.page -exec ~/t.sh {} | sort

我对你的awk脚本不太确定但是因为你认为它是你需要的,所以现在让我们传递它。

答案 1 :(得分:1)

它们是原始命令的多个问题,其中没有一个是转义{}。第一个问题是{}\;之间需要有一个空格。第二个问题与shell如何在find iname参数*.page中扩展通配符有关。

来自Free BSD Forums

  

“*”在命令行传递给find(1)之前由shell扩展。如果目录中只有1个项目,那么它可以工作。如果   目录中有多个项目,然后它会失败   命令行选项不再正确。

将* .page包装在引号中可以解决问题。最终版本是

find . -iname '*.page' -exec awk '{if(length($0) > L) 
{ LINE=NR;L = length($0)}} END {print L"|"FILENAME":"LINE}' {} \; | sort -n

其中输出行号为

的每个文件的最长行的排序列表
220|./Example1.page:157
206|./Example2.page:203