文档教程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 练习「Directories Comparison」(习题 与 参考解答)为骨架展开讲解在 Linux 环境下如何接收两个目录路径作为脚本参数、判断二者内容是否一致并输出差异。读完本文你将掌握基于test、md5sum、diff等经典命令的目录比对脚本写法理解校验和快照与逐文件递归比较两种思路的适用场景并能在日常巡检、部署一致性检查中直接复用这些方案。一、练习目标两个目录参数输出其间差异原文档topics/shell/directories_comparison.md给出的目标非常精简给定两个目录作为参数脚本输出两个目录之间的任何差异。这个目标拆解出三个需要解决的问题参数接收与校验脚本必须接收恰好两个目录路径少了、多了或根本不是目录都应当给出明确提示并退出差异判定需要一种可复现、可比较的手段来判断两个目录是否相同差异输出当二者不一致时把差异哪些文件不同、哪些文件只在一边存在展示给用户。在仓库中该练习被归类于 Shell 脚本分类下的 Misc杂项级别难度标注为 Basictopics/shell/README.md与 Argument Check、Empty Files 等基础练习并列适合作为 Bash 脚本入门的综合练手题目。二、方案一基于校验和的快速比对脚本dirdiff.sh原文档给出的第一个解答是一份完整的 Bash 脚本topics/shell/solutions/directories_comparison.md文件名建议为dirdiff.sh#!/bin/bash if test $# -ne 2 then echo -e USAGE: ./dirdiff.sh directory1 directory2 exit 1 fi # check for the checksums. # If both the checksums same, then both directories are same if test ls -1 $1 | sort | md5sum | awk -F {print $1} ls -1 $2 | sort | md5sum | awk -F {print $1} then echo -e No difference between the 2 directories exit 0 fi diff -q $1 $2这段脚本逻辑清晰分为三个环节下面逐段拆解。2.1 参数个数校验test $# -ne 2脚本第一道防线是参数个数检查if test $# -ne 2 then echo -e USAGE: ./dirdiff.sh directory1 directory2 exit 1 fi$#是 Bash 内置的特殊变量表示传入脚本的参数个数test $# -ne 2即参数个数不等于 2时进入分支此时打印用法提示USAGE: ./dirdiff.sh directory1 directory2并以退出码 1表示出错结束。test等价写法是[ ... ]是 POSIX 风格的条件测试命令-nenot equal专用于整数比较。关于$#、$、$*等特殊参数变量的含义topics/shell/README.md 的自测部分也有对应说明——$是所有参数构成的数组$*是所有参数拼成的单个字符串。需要注意的是这一版脚本只校验了参数个数并未校验参数指向的路径是否真的是目录。若想更健壮可以补上-d目录存在性检查见下文仓库中另一份解答的增强版。2.2 校验和快照比对ls | sort | md5sum | awk这是整个方案的核心思路——用目录清单的校验和代替逐文件比较if test ls -1 $1 | sort | md5sum | awk -F {print $1} ls -1 $2 | sort | md5sum | awk -F {print $1}管道逐级拆解如下命令段作用ls -1 $1每行只输出一个文件/子目录名-1等价于单列输出sort对文件名排序保证两侧清单顺序一致避免因目录项排列顺序不同产生误报md5sum对排序后的清单整体计算 MD5 校验和awk -F {print $1}以两个空格为分隔符截取校验和字段md5sum输出格式为校验和 文件名此处无需文件名两侧各得一个 MD5 值后用比较相等说明两个目录的文件名清单完全一致注意这里比较的是条目名不涉及文件内容打印No difference between the 2 directories并以退出码 0 正常结束不相等跳过该分支进入下一步用diff -q输出具体差异。这一思路的优势是快——整个比较只需两次ls、两次校验和计算适合快速判断目录是否一致局限也很明显ls默认不递归子目录内部的差异无法覆盖且校验和针对的是文件名清单而非文件内容。因此它更适用于浅层目录的一致性预检。2.3 差异输出diff -q $1 $2当校验和不一致时脚本执行diff -q $1 $2-q等价于--brief让diff只报告哪些文件有差异而不输出具体内容输出形如Files dir1/a.conf and dir2/a.conf differ这一步不递归属于浅层比较与前文的ls -1清单范围保持一致。2.4 运行方式与退出码约定赋予执行权限后运行./dirdiff.sh directory1 directory2退出码约定0 表示无差异/成功1 表示参数错误/有差异路径出错这一约定与脚本中exit 0、exit 1一一对应可在其他脚本中通过$?读取以做流程控制。三、方案二GNU diff 递归比较一行搞定原文档给出的第二个解答更加简洁——利用 GNUfind与diff的组合能力diff --recursive directory1 directory2--recursive简写为-r使diff递归进入两个目录的每一层子目录逐文件比对内容并报告两侧同名但内容不同的文件只存在于其中一侧的文件/目录两侧目录结构的差异。关于这一方案的佐证仓库exercises/目录下的 Shell 练习解答也给出了同样的思路exercises/shell/solutions/directories_comparison.md 的解答即以diff -r folder1/ folder2/为例并明确指出若两侧内容完全一致则无任何输出若存在差异则展示哪些文件不同或缺失exercises/shell/solutions/directories_comparision.md 同样强调diff -r会递归比较两个目录。相比方案一diff -r的优势在于递归且比较内容不只比文件名清单还逐字节比较文件内容零脚本成本单条命令即可适合一次性手工比对差异信息完整能明确指出缺失文件与内容差异的细节。若只想看差异概览而不关心具体行级内容可追加-qdiff -rq directory1 directory2。四、仓库中的增强版解答函数化 目录校验 帮助选项原文档的解答只校验参数个数仓库exercises/目录下的另一份解答则演示了更工程化的写法exercises/shell/solutions/directories_comparison.md可作为原方案一的直接升级模板核心要点如下#!/usr/bin/env bash help () { echo Usage: compare filename1 filename2 echo } validate_args() { # Ensure that 2 arguments are passed if [ $# ! 2 ] then help exit 1 fi i1 for dir in $ do # Validate existence of directories if [ ! -d $dir ] then echo Directory $dir does not exist exit 1 fi echo Directory $i: $dir i$((i 1)) done echo } compare() { echo Comparing directories... echo diff -r $1 $2 if [ $? -eq 0 ] then echo No difference fi exit 0 } while getopts :h option; do case $option in h) # display Help help exit 0;; \?) # invalid option echo Error: Invalid option exit 1;; esac done validate_args $ compare $1 $2这份增强版对原解答做了三处有价值的补充目录存在性校验通过for dir in $遍历所有参数用[ ! -d $dir ]逐一确认参数确实是存在的目录否则报错退出——弥补了原脚本只查个数、不查类型的缺口函数化组织将帮助输出、参数校验、核心比较分别封装为help、validate_args、compare函数主流程只剩三行调用可读性与可维护性明显提升递归比较 状态判断compare内部使用diff -r递归比对并通过$?判断diff的退出码——0 表示无差异此时打印No difference。这与原文档方案一校验和相等即无差异的判断思路殊途同归但基于的是逐文件内容比较结果。另外#!/usr/bin/env bash与#!/bin/bash的区别也值得一提前者通过PATH查找 bash可移植性更好两种写法在常规 Linux 环境中均可直接使用topics/shell/README.md 对 shebang 有专门讲解bash 即 Bourne-again shell是 Linux 默认登录 shell 中最常用的实现。五、三种方案对比与选型建议维度方案一校验和方案二diff -r增强版脚本命令ls/sort/md5sum/awkdiff --recursive函数化 diff -r是否递归否是是比较对象文件名清单的校验和文件内容文件内容输出粒度有无差异浅层具体差异明细具体差异明细适用场景快速预检、大批量浅层目录一次性人工比对可复用、可维护的日常脚本选型建议只需快速判断两个目录的文件清单是否相同用方案一或其中校验和片段需要完整、递归、内容级的差异明细直接使用diff -r directory1 directory2即方案二需要把目录比对固化为团队可复用脚本含帮助、参数校验、退出码约定参照增强版结构。六、延伸与进程替换、set -e等 Shell 特性的关联本练习所处的 topics/shell/README.md 还提供了两条与本主题直接相关的延伸知识进程替换比较diff (ls /tmp) (ls /var/tmp)利用进程替换process substitution把两条命令的输出直接作为diff的输入——当管道|无法满足同时取多路输出时这正是目录清单比对的另一种轻量变体set -e与脚本稳健性该仓库自测部分明确指出默认情况下 Bash 脚本某条命令失败后仍会继续执行后续命令若希望命令失败即退出需在脚本开头显式使用set -e。对本练习而言若要求任一校验失败立即终止可在dirdiff.sh首行加入set -e或在每次diff后主动检查$?增强版正是后者。七、小结围绕 devops-exercises 仓库的「Directories Comparison」练习本文完整解析了两种官方解答基于ls | sort | md5sum | awk校验和快照的浅层快速比对脚本dirdiff.sh以及基于 GNUdiff --recursive的递归内容比较并结合 exercises/shell/solutions/directories_comparison.md 的增强版实现给出了目录校验、函数化封装、退出码判断等工程化升级路径。无论是面试准备、日常巡检脚本还是部署前后一致性验证这套参数校验 比对 差异输出的骨架都可以直接迁移复用。赞分享文档教程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 实战用 Bash 与 diff 精确比较两个目录的差异devops exercises 实战用 Bash 与 diff 精确比较两个目录的差异 本指南基于 devops exercises https://lin文档教程DevOps运维Linux 目录递归对比实战用 diff -r 与 Shell 脚本检测两个目录的差异devops-exercises 详解Linux 目录递归对比实战用 diff r 与 Shell 脚本检测两个目录的差异devops exercises 详解 导读 在日常运维与 DevOp文档教程DevOps运维Bash 目录比较实战用 diff -r 与参数校验编写可复用的目录差异检查脚本Bash 目录比较实战用 diff r 与参数校验编写可复用的目录差异检查脚本 本篇指南以 devops exercises 仓库的 Shell 练习「Dir文档教程DevOps运维创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考