Bash:在目录中查找少于n行的文件

时间:2019-06-11 14:23:13

标签: bash

我有一个包含多个文件的目录:

filename_10-1.txt
filename_10-2.txt
...
filename_10-1000.txt
filename_20-1.txt
filename_20-2.txt
...
filename_20-1000.txt
...
filename_600-1000.txt

我想列出行数少于文件名第一个数字两倍的所有文件(例如filename_10-874应该有20行(2 * 10行)而filename_40-684应该有80行(2 * 40行)。

方法

第1步:我能够计算单个文件中的行数,例如:

wc -l filename_10-1.txt

第2步:找到所有文件中的行数

for i in $(find filename_* -type f); 
    do wc -l $i; 
done

第3步:仅列出行数少于文件名状态的文件。

我偶然发现了这个post,但是我无法更改代码来满足自己的需求。

问题

如何列出所有行数少于文件名中的数字的文件?

2 个答案:

答案 0 :(得分:2)

您可以使用以下脚本:

shopt -s extglob

for f in *.txt; do
   n="${f//@(*_|-*)}" # extract first number
   (( $(wc -l < "$f") < 2*$n )) && echo "$f" # list files with less lines than 2*$n
done

this tutorial中解释了扩展的glob语法(@(*_|-*))。在此代码中,*_删除所有文本,直到我们得到_,然后-*删除-之后的所有文本。

答案 1 :(得分:0)

您可以使用awk来计算行数,并在文件名超过给定数目时打印文件名。使用Gnu Awk,您可以:

awk 'BEGINFILE { f=FILENAME; n=gsub(/^.*_/,"",f)*2 }
     (FNR == n) { nextfile }
     ENDFILE{ if (FNR < n) print FILENAME }' filename_*.txt