查找完全n行的所有文件

时间:2017-09-06 11:17:57

标签: bash shell

我解决了写一个小脚本has_n_lines.sh的问题,该脚本接收n作为参数(在这种情况下是一组特定的txt文件):

#!/bin/bash

files=`find . -name "*.txt"`

for file in $files
do
    nlines=`wc -l $file | cut -d " " -f1`
    if [ "$nlines" -eq "$1" ]
    then
        echo $file
    fi
done

有没有更简单的方法呢?

由于

2 个答案:

答案 0 :(得分:3)

是的,这样的事情可以解决问题

find . -name "*.txt" -exec bash -c 'wc -l < "$1"' -- {} \;

这样做当然是找到所有.txt个文件。然后它通过逐个文件发送wc -l来执行<发送,{}逐个文件使用。 \;表示-exec结束的位置。通过<发送文件名使wc -l只输出行数。现在您可以通过以下方式介绍比较:

find . -name "*.txt" -exec bash -c '(($(wc -l < "$1") == $n)) && echo "$1"' -- {} \;

其中$n是您想要的行数。

  

说明(感谢John Kugelman:重定向(<)或if语句不能直接与find ... -exec一起使用。这意味着您需要显式调用子shell,您可以在其中使用它们。为了更加安全,--$0{}$1,后者用于子shell。这可确保正确处理包含空格的文件名。

     

在调用上述命令之前,您还需要export $n,因为子shell无法访问$n。因此,如果您运行bash has_n_lines.sh 123,其中123是所需的行数,请将其添加到has_n_lines.shn=$1 && export $n;

答案 1 :(得分:0)

或没有技巧:

vocabulary_cpp ❱ wc -l `find . -name '*.txt'`
    24 ./iterator_01.txt
   707 ./iterator_01_longman.txt
  3122 ./algorithm_now_word.txt
   113 ./list.txt
  3966 total
vocabulary_cpp ❱ wc -l `find . -name '*.txt'` | grep -P "^ +24"
    24 ./iterator_01.txt
vocabulary_cpp ❱ 

因此:

#!/bin/bash
wc -l `find . -name '*.txt'` | grep -P "^ +$1"

vocabulary_cpp ❱ ./test.sh 24
    24 ./iterator_01.txt
vocabulary_cpp ❱