2016-08-02 68 views
0

我有400个文件夹里面的几个文件,我感兴趣的是:呼应一个ls命令的输出与小于n文件

  1. 计数与扩展.solution许多文件是如何每个文件夹中,并
  2. 然后输出只有那些文件夹具有小于440层的元件

的点1)很容易获得与命令:

for folder in $(ls -d */ | grep "sol_cv_"); 
do 
    a=$(ls -1 "$folder"/*.solution | wc -l); 
    echo $folder has "${a}" files; 
done 

但是,有没有简单的方法来过滤只有少于440个元素的文件?

+0

文件夹上方的文件夹? – 123

+0

是的,没有子文件夹,每个文件夹都有一堆txt文件,但我只对'* .solution'扩展名感兴趣 – user2380782

+0

@ user2380782:能不能更新400文件夹的基础文件夹? – sjsam

回答

1

这个简单的脚本可以为你工作: -

#!/bin/bash 

MAX=440 

for folder in sol_cv_*; do 
    COUNT=$(find "$folder" -type f -name "*.solution" | wc -l) 
    ((COUNT < MAX)) && echo "$folder" 
done 
1

下面

counterfun(){ 
count=$(find "$1" -maxdepth 1 -type f -iname "*.solution" | wc -l) 
((count < 440)) && echo "$1" 
} 
export -f counterfun 
find /YOUR/BASE/FOLDER/ -maxdepth 1 -type d -iname "sol_cv_*" -exec bash -c 'counterfun "$1"' _ {} \; 
#maxdepth 1 in both find above as you've confirmed no sub-folders 

脚本应该做

1

避免解析ls命令,并使用printf '%q\n计数文件:

for folder in *sol_cv_*/; do 
    # if there are less than 440 elements then skip 
    (($(printf '%q\n' "$folder"/* | wc -l) < 440)) && continue 
    # otherwise print the count using safer printf '%q\n' 
    echo "$folder has $(printf '%q\n' "$folder"*.solution | wc -l) files" 
done 
+0

你的命令不会给我一个输出,并且至少有10个文件夹小于440'* .solution'文件 – user2380782

+0

是的,它列出所有目标文件夹 – user2380782

+0

这是一个例子在输出中的:'sol_cv_212 /:2 sol_cv_213 /:2 sol_cv_214 /:2 sol_cv_215 /:2 sol_cv_216 /:2 sol_cv_217 /:2' – user2380782