ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

devops-exercises Shell 实战:用 for 循环 + `ls`/`du`/`cut` 统计当前目录下所有文件与目录的大小

devops-exercises Shell 实战:用 for 循环 + `ls`/`du`/`cut` 统计当前目录下所有文件与目录的大小 文档教程DevOps运维【免费下载链接】devops-exercisesLinux, Jenkins, AWS, SRE, Prometheus, Docker, Python, Ansible, Git, Kubernetes, Terraform, OpenStack, SQL, NoSQL, Azure, GCP, DNS, Elastic, Network, Virtualization. DevOps Interview Questions项目地址https://gitcode.com/GitHub_Trending/de/devops-exercises点击查看免费下载导读本文以 devops-exercises 仓库中 Files Size 练习 及其 官方解答 为骨架系统讲解如何用 Bash 编写一个遍历当前目录、逐项打印文件与目录名称和占用空间大小的脚本。文中会逐行拆解ls -S1、du -sh、cut -f1与for循环的组合用法并补充参数化、健壮性改进、替代实现与相关练习帮助你掌握遍历目录 解析命令输出 循环输出这一 DevOps 日常运维中最常用的脚本套路。读完本文你能独立写出可复用、可扩展的目录大小统计脚本并理解每一步背后的原理。一、练习背景它在 Shell 练习题中的位置在仓库的 Shell 脚本练习总表 中Files Size 属于For Loopsfor 循环主题难度标记为Basic基础与 Hello World变量、Basic date变量、Factors算术、Argument Check条件判断、Count Chars输入 while 循环、Sum函数等题目一起构成了一条从变量、条件、循环到函数的循序渐进学习路径。原题目标非常简洁打印当前路径下每一个文件和目录的名称与大小并且必须使用至少一个 for 循环。这道题的训练点非常明确在必须使用 for 循环的前提下把命令输出变成循环输入再把每条命令的输出按需要切片最后格式化打印。这正是日常巡检脚本、CI 日志整理、磁盘占用分析中反复出现的模式。二、官方解答逐行拆解仓库给出的标准解答保存在 solutions/files_size.md完整脚本如下#!/usr/bin/env bash for i in $(ls -S1); do echo $i: $(du -sh $i | cut -f1) done下面逐行说明它的工作原理。1. Shebang#!/usr/bin/env bash脚本第一行的 Shebang 告诉操作系统用哪个解释器来执行本脚本。仓库 Shell 自测部分 对 Shebang 有专门解释/bin/bash是最常用的默认登录 shellBashBourne-again shell功能丰富、语法完善能执行绝大多数脚本。这里使用#!/usr/bin/env bash而不是写死#!/bin/bash好处是让系统在PATH中查找bash在不同发行版上兼容性更好。要让 Shebang 生效还需要给脚本赋予执行权限并直接运行chmod x files_size.sh ./files_size.sh注意仓库是只读的脚本可直接在本地按上述方式创建和运行无需改动仓库。2. 命令替换$(ls -S1)$(...)是命令替换command substitution先执行括号内的命令再把它的标准输出作为字符串代入到外层语句中。这里是整个脚本的数据来源。ls -S1由两个选项组成-S按文件大小降序排序大的在前-1数字 1每行只输出一个条目避免多列排版。于是$(ls -S1)展开后就是一行一个文件/目录名的列表例如big_file.bin script.sh some_dir small.txt这正是 for 循环理想的输入格式——按行分隔、无需额外处理。需要注意的是ls默认不输出隐藏文件以.开头的文件因此本脚本统计的是当前目录下的非隐藏条目。3. for 循环for i in $(ls -S1); do ... done这是原题硬性要求use at least one for loop!的核心。循环把上面命令替换得到的每个单词默认按空白/换行切分依次赋给变量i每次迭代执行循环体内的命令for i in $(ls -S1); do echo $i: $(du -sh $i | cut -f1) done仓库 Shell 自测部分也要求读者理解循环是什么、有哪些类型、如何演示使用——本题的 for 循环正是最经典的演示案例for遍历列表、do...done界定循环体。4. 统计大小du -sh $i对每个条目$i执行du-ssummary只输出总计大小不递归列出内部子项-hhuman-readable以人类可读的单位K、M、G输出而非纯字节数$i用双引号包裹变量这是 Bash 最佳实践——防止文件名含空格或特殊字符时被错误切分例如my file.txt不加引号会被拆成两个参数。du对目录输出的是该目录递归占用的总空间对文件输出的是该文件的磁盘占用大小通常以 4K 块为最小单位对齐因此可能略大于文件字节数。例如输出1.2M big_file.bin注意du -sh的默认输出是大小TAB路径两列。5. 切出大小列cut -f1cut以分隔符切分每行并取出指定字段。默认分隔符是TAB 制表符-f1表示取第 1 个字段也就是把du输出的1.2M big_file.bin中的1.2M单独提取出来1.2Mcut在仓库 Shell 练习中的其他解法里也频繁出现例如 Count Chars 解答 使用wc -c统计字符数Directories Comparison 解答 使用awk -F {print $1}提取 checksum 字段——可见命令输出 → 提取字段是贯穿整个练习题集的基本功。6. 输出echo $i: ...把名称和大小拼成一行打印big_file.bin: 1.2M script.sh: 4.0K some_dir: 10K small.txt: 4.0K完整执行流程把整段脚本放到一起看它做了三件事ls -S1生成按大小降序、一行一个的条目列表for 循环逐个取出条目名对每个条目执行du -sh并cut -f1提取大小最后拼接打印。由于ls -S按大小降序输出天然就是从大到小的排行榜非常适合快速找出哪个文件/目录最占空间。三、实际运行效果示例在当前目录放置一个测试目录demo/内含一个大文件、一个脚本、一个子目录和一个小文本文件运行上述脚本输出大致如下$ ./files_size.sh big_file.bin: 512M data_dir: 98M script.sh: 4.0K readme.txt: 4.0K可以看到大文件排在最前-S降序生效目录data_dir输出的是其递归总占用每个条目的名称与人类可读大小一一对应。四、进阶改进与健壮性增强官方解答足够简洁但直接用于生产环境时有几个可以明显加固的点以下均为在本地脚本中可实践的改进不改动仓库文件。1. 文件名含空格的问题for i in $(ls -S1)依赖单词分割只要文件名里含空格如my file.txt命令替换的结果就会被拆成两个单词循环会把my和file.txt当成两个条目导致du报错。更稳健的做法是改用按行读取的方式#!/usr/bin/env bash while IFS read -r entry; do size$(du -sh $entry | cut -f1) printf %s: %s\n $entry $size done (ls -S1)这里IFS read -r关闭分隔符处理并按行原样读取-r防止反斜杠转义 (...)使用进程替换process substitution把ls -S1的输出作为 while 循环的输入流——仓库自测部分也专门考过进程替换的用法diff (ls /tmp) (ls /var/tmp)其用途正是把命令输出传给另一条命令当输入且无需经过管道。2. 隐藏文件与更精确的大小若希望把隐藏文件也纳入统计可改用ls -AS1加-A输出除.和..之外的所有条目。若希望拿到精确字节数而非人类可读大小可以把du -sh换成du -s去掉-h再结合cut -f1输出纯数字便于在脚本里做比较或汇总。3. 对单条命令失败做容错du对无权限读取的目录会输出错误信息可以把标准错误丢弃并给出友好提示size$(du -sh $entry 2/dev/null | cut -f1) [ -n $size ] || sizeN/A4. 参数化把当前目录换成目标目录原题限定当前路径若要统计任意目录只需接受第一个参数并cd或直接传入du#!/usr/bin/env bash target${1:-.} while IFS read -r entry; do size$(du -sh $target/$entry 2/dev/null | cut -f1) printf %s: %s\n $entry ${size:-N/A} done (ls -S1 $target)${1:-.}是参数默认值展开——没有传参时用当前目录.这正是仓库自测里考察的${1:-yay}模式的实际应用。五、把本题放进更大的练习上下文这道题不是孤立的。把本解答与仓库其他 Shell 练习放在一起可以看出一条清晰的技能递进线练习文件主题与本题的关联Hello World / 解答变量理解$i这类变量赋值与展开Argument Check / 解答条件判断为脚本增加参数校验如检查目录是否存在Count Chars / 解答输入 while 循环对比 while 按行读与 for 按单词遍历的取舍Sum / 解答函数把取大小并格式化封装成函数复用Directories Comparison / 解答Misc展示ls | sort | md5sum | awk的命令链式处理风格例如参考 Sum 解答 中先用正则校验输入、失败即exit 2的写法可以给 Files Size 脚本加上参数必须是存在的目录否则退出并提示用法的前置校验参考 Directories Comparison 里test $# -ne 2的参数数量检查可以补全脚本的USAGE提示。这样一道基础练习题就能成长为一个具备参数校验、错误处理和友好输出的完整运维工具。六、小结与自查通过这道题你实际掌握了以下核心能力ls -S1选项组合-S按大小降序、-1单行输出构造适合循环的条目列表命令替换$(...)把命令输出变成循环遍历的数据源du -sh以人类可读单位输出文件/目录递归占用大小cut -f1按 TAB 分隔符提取字段精准拿到大小列引号与单词分割理解$i为什么必要以及何时改用while read可维护性改进参数默认值、2/dev/null容错、进程替换。可以试着用仓库 Shell 自测部分 的问题验证自己的理解#!/bin/bash是什么脚本默认在命令失败时是否退出$与$*的区别${var//*.}这类子串操作如何影响你对输出字段的处理把这些概念与本题的实战代码结合起来就是一次完整的 Shell 循环与文本处理训练。最后把脚本放到任意真实目录里跑一遍例如du -sh常用作排查磁盘占用的第一步对照输出检查是否与du -sh .的总量一致你的 for 循环 文本切片技能就真正落地了。赞分享文档教程DevOps运维【免费下载链接】devops-exercisesLinux, Jenkins, AWS, SRE, Prometheus, Docker, Python, Ansible, Git, Kubernetes, Terraform, OpenStack, SQL, NoSQL, Azure, GCP, DNS, Elastic, Network, Virtualization. DevOps Interview Questions项目地址https://gitcode.com/GitHub_Trending/de/devops-exercises点击查看免费下载相关推荐devops-exercises Shell 实战用 for 循环打印当前目录下所有文件与目录的大小Files Size 练习精解devops exercises Shell 实战用 for 循环打印当前目录下所有文件与目录的大小Files Size 练习精解 本篇技术指南围绕 de文档教程DevOps运维React Native环境配置与编译10分钟快速搭建开发环境React Native环境配置与编译10分钟快速搭建开发环境 React Native环境配置 是每个移动开发者的必经之路无论你是前端开发者想要进军实战 Bash 脚本删除目录含子目录中所有空文件的完整指南 —— devops-exercises 之 Empty Files 习题解析实战 Bash 脚本删除目录含子目录中所有空文件的完整指南 —— devops exercises 之 Empty Files 习题解析 本篇指南围绕开源文档教程DevOps运维创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表