Bash中文件夹内容比对:匹配文件夹与文件的特定数字段
解决文件夹与文件的跨格式匹配问题
这问题我碰到过类似的,diff因为两边命名格式差异太大,确实没法直接识别对应关系,得先把两边的共同数字标识提取出来再比对。给你两个实用的方法:
方法一:用Bash脚本(清晰易读,适合复杂场景)
写个简单的循环脚本,遍历folder1的子文件夹,提取数字部分后去folder2找对应文件:
#!/bin/bash # 遍历folder1中符合格式的子文件夹 for dir in folder1/*_*.*.*; do # 跳过非目录项(如果有不符合格式的文件混在里面) [[ -d "$dir" ]] || continue # 提取下划线后的数字段:比如从"folder1/test_12345.1.2"得到"12345.1.2" num_part="${dir#folder1/*_}" # 检查folder2中是否存在对应.physio文件 if [[ -f "folder2/${num_part}.physio" ]]; then echo "✅ 找到匹配:$dir ↔ folder2/${num_part}.physio" else echo "❌ 无对应匹配:$dir" fi done
把这段代码存成match_check.sh,给执行权限chmod +x match_check.sh,运行就能看到结果。脚本里加了跳过非目录的判断,避免误处理folder1里的文件。
方法二:一行命令(快速执行,适合临时检查)
如果不想写脚本,用管道组合命令也能搞定:
ls -d folder1/*_*.*.* | sed 's/folder1\/.*_\(.*\)/\1/' | xargs -I {} sh -c 'if [ -f "folder2/{}.physio" ]; then echo "匹配:{}"; else echo "无匹配:{}"; fi'
ls -d只列出目录(避免列出folder1里的文件)sed用来提取下划线后的数字段,把folder1/xxx_12345.1.2转换成12345.1.2xargs把提取出的数字段传递给后续命令,检查对应.physio文件是否存在
如果只想看有匹配的项,去掉else部分就行:
ls -d folder1/*_*.*.* | sed 's/folder1\/.*_\(.*\)/\1/' | xargs -I {} sh -c 'if [ -f "folder2/{}.physio" ]; then echo "匹配:{}"; fi'
内容的提问来源于stack exchange,提问作者katswnt
相关产品推荐
相关产品推荐

