2016-08-02 67 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