php cli查找最大文件及文件夹占用排行

调用:保存代码修改$dir配置cmd执行

例:php findtop.php

<?php

$dir = 'D:';
$limit = 50;


//查找$dir下硬盘容量占用最多的前$limit个文件夹
//dir_size_max($dir, $limit);

//查找$dir下硬盘容量占用最多的前$limit个文件
//file_size_max($dir,$limit);


//查找文件
function file_size_max($dir, $limit)
{
    $arr_file = [];
    treefile($arr_file, $dir);
    $res = paixufile($arr_file, $limit);
    shuchu($res);
}

//查找文件夹
function dir_size_max($dir, $limit)
{
    $arr_dir = [];
    treedir($arr_dir, $dir);
    $res = paixu_dir($arr_dir, $limit);
    shuchu($res);
}

//文件夹排序
function paixu_dir($arr, $limit)
{
    array_multisort(array_column($arr, 'len'), SORT_DESC, $arr);
    foreach ($arr as $key=>$item){
        foreach ($arr as $item1){
            if($item['key']===$item1['dirkey']){
                $arr[$key]['size']+=$item1['size'];
            }
        }
    }
    array_multisort(array_column($arr, 'size'), SORT_DESC, $arr);
    $p = 1;
    foreach ($arr as $item) {
        if ($p > $limit) {
            break;
        }
        $res[] = ['file' => $item['file'], 'size' => convertSize($item['size']),];
        $p++;
    }
    return $res;
}


//文件排序
function paixufile($arr, $limit)
{
    $res = [];
    array_multisort(array_column($arr, 'size'), SORT_DESC, $arr);
    $p = 1;
    foreach ($arr as $item) {
        if ($p > $limit) {
            break;
        }
        $res[] = ['file' => $item['file'], 'size' => convertSize($item['size']),];
        $p++;
    }
    return $res;
}

//输出结果
function shuchu($arr)
{
    echo "\n\n";
    foreach ($arr as $item) {
        echo $item['size'] . ' -> ' . $item['file'] . "\n";
    }
    echo "\n\n";
}


//获取文件及大小
function treefile(&$arr_file, $directory)
{
    $mydir = dir($directory);
    while ($file = $mydir->read()) {
        if ($file === '.' || $file === '..' || $file === 'System Volume Information') {
            continue;
        }
        if ((is_dir($mydir->path . '/' . $file))) {
            treefile($arr_file, $mydir->path . '/' . $file,);
        } else {
            $arr_file[] = [
                'file' => $mydir->path . '/' . $file,
                'size' => filesize($mydir->path . '/' . $file),
            ];
        }
    }
    $mydir->close();
}

//获取文件夹及大小
function treedir(&$arr_dir, $directory)
{
    echo $directory."\n";
    if(empty($arr_dir[sha1($directory)])){
        $arr_dir[sha1($directory)] = [
            'dirkey' => '',
            'key' => sha1($directory),
            'file' => $directory,
            'size' => 0,
            'len' => strlen($directory),
        ];
    }
    $mydir = dir($directory);
    while ($file = $mydir->read()) {
        if ($file === '.' || $file === '..' || $file === 'System Volume Information') {
            continue;
        }
        if (is_dir($mydir->path . '/' . $file)) {
            $arr_dir[sha1($mydir->path . '/' . $file)] = [
                'dirkey' => sha1($mydir->path),
                'key' => sha1($mydir->path . '/' . $file),
                'file' => $mydir->path . '/' . $file,
                'size' => 0,
                'len' => strlen($mydir->path . '/' . $file),
            ];
            treedir($arr_dir, $mydir->path . '/' . $file,);
        } else {
            if(!empty($arr_dir[sha1($mydir->path)])){
                $arr_dir[sha1($mydir->path)]['size']+=filesize($mydir->path . '/' . $file);
            }
        }
    }
    $mydir->close();
}

//容量格式化
function convertSize($size)
{
    $units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB',];
    for ($i = 0; $size >= 1024 && $i < count($units) - 1; $i++) {
        $size /= 1024;
    }
    return sprintf("%10s", round($size, 3) . ' ' . $units[$i]);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

etafort

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值