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大小文件的数量。但它不是真正的代码。我的错是什么?
答案 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 {} \;
)谓词在最后! 不要交换谓词的顺序!