ls命令和shell脚本中的文件大小

时间:2015-11-01 15:14:16

标签: bash shell awk ls

count=0;      #count for counting
IFS='
'
for x in `ls -l $input`;     #for loop using ls command
do 
a=$(ls -ls | awk '{print $6}')   #print[6] is sizes of  file
echo $a

b=`echo $a | awk '{split($0,numbers," "); print numbers[1]}'`
echo $b     
if [ $b -eq 0 ]          # b is only  size of a file
then
count=`expr $count + 1`   #if b is zero , the count will increase one by one
fi
echo $count
done

我想找到0个大小的文件。我使用find命令执行此操作。第二件事是我想使用ls命令和awk计算具有0大小文件的数量。但它不是真正的代码。我的错是什么?

2 个答案:

答案 0 :(得分:2)

如果文件的大小非零,则-s测试为真。如果该文件的测试失败,请增加空文件数。

empty_files=0   
for f in "$input"/*; do
    [ -s "$f" ] || : $(( empty_files++ ))
done

答案 1 :(得分:1)

你的主要错误是你parsing ls

如果您要查找(常规)空文件,并且您的find版本支持-empty谓词,请使用它:

find . -type f -empty

请注意,这也将在子文件夹中递归;如果您不想这样,请使用:

find . -maxdepth 1 -type f -empty

(假设您的find也支持-maxdepth)。

如果您只想计算您有多少空(常规)文件:

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

如果你想同时执行这两个操作,即打印出名称或将它们保存在一个数组中以备将来使用,并计算它们:

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

如果Bash≥4.4,您可以使用mapfile代替while - read循环:

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

对于符合POSIX标准的方式,请将test-s选项一起使用:

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

如果你不想递归到子目录,你必须-prune他们:

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

如果你想算数:

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

并且在这里,如果您要执行这两项操作(计算它们并将它们保存在一个数组中供以后使用),请使用之前的while - read循环(或mapfile if这个find

,你生活在未来
find . \! -name . -prune -type f \! -exec test -s {} \; -exec printf '%s\0' {} \;

另请参阅chepner's answer了解纯shell解决方案(需要稍微调整才能符合POSIX标准)。

关于你的评论

  

我想计算并删除[空文件]。我怎么能同时做到这一点?

如果你有GNU find(或支持所有好东西的find):

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

如果没有,

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

确保-delete(或-exec rm {} \;)谓词在最后! 不要交换谓词的顺序!