bash - ls command and size of files in shell script -


count=0;      #count counting ifs=' ' x in `ls -l $input`;     #for loop using ls command  a=$(ls -ls | awk '{print $6}')   #print[6] sizes of  file echo $a  b=`echo $a | awk '{split($0,numbers," "); print numbers[1]}'` echo $b      if [ $b -eq 0 ]          # b  size of file count=`expr $count + 1`   #if b 0 , count increase 1 one fi echo $count done 

i want find 0 size files . using find command. second thing want count number of has 0 size of files using ls command , awk. doesn't true code . mistake ?

your main mistake you're parsing ls!

if want find (regular) files empty, , if have version of find supports -empty predicate, use it:

find . -type f -empty 

note recurse in subfolders too; if don't want that, use:

find . -maxdepth 1 -type f -empty 

(assuming find supports -maxdepth).

if want count how many empty (regular) files have:

find . -maxdepth 1 -type f -empty -printf x | wc -m 

and if want perform both operations @ same time, i.e., print out name or save them in array future use, , count them:

empty_files=() while ifs= read -r -d '' f;     empty_files+=( "$f" ) done < <(find . -maxdepth 1 -type f -empty -print0) printf 'there %d empty files:\n' "${#empty_files[@]}" printf '   %s\n' "${empty_files[@]}" 

with bash≥4.4, use mapfile instead of while-read loop:

mapfile -t -d '' empty_files < <(find . -maxdepth 1 -type f -empty -print0) printf 'there %d empty files:\n' "${#empty_files[@]}" printf '   %s\n' "${empty_files[@]}" 

for posix-compliant way, use test -s option:

find . -type f \! -exec test -s {} \; -print 

and if don't want recurse subdirectories, you'll have -prune them:

find . \! -name . -prune -type f \! -exec test -s {} \; -print 

and if want count them:

find . \! -name . -prune -type f \! -exec test -s {} \; -exec printf x | wc -m 

and here, if want perform both operations (count them , save them in array later use), use previous while-read loop (or mapfile if live in future) find:

find . \! -name . -prune -type f \! -exec test -s {} \; -exec printf '%s\0' {} \; 

also see chepner's answer pure shell solution (needs minor tweaking posix compliant).


regarding comment

i want count , delete [empty files]. how can @ same time?

if have gnu find (or find supports goodies):

find . -maxdepth 1 -type f -empty -printf x -delete | wc -m 

if not,

find . \! -name . -prune -type f \! -exec test -s {} \; -printf x -exec rm {} \; | wc -m 

make sure -delete (or -exec rm {} \;) predicate @ end! do not exchange order of predicates!


Comments

Popular posts from this blog

javascript - Slick Slider width recalculation -

jsf - PrimeFaces Datatable - What is f:facet actually doing? -

angular2 services - Angular 2 RC 4 Http post not firing -