Shell脚本循环中如何排除指定.txt文件设置777权限?
解决Shell脚本批量设置权限时排除指定文件的问题
嘿,这里有几个实用的方案可以帮你搞定这个需求——给$Files目录下大部分.txt文件设777权限,但跳过那7个特定文件。你可以根据自己的使用场景选:
方法1:用条件判断逐个检查(兼容性最强)
这种方法几乎在所有POSIX兼容的shell里都能跑,不用依赖特殊功能。先把要排除的文件名列出来,循环的时候判断当前文件是不是在排除列表里,不在就执行权限修改:
#!/bin/sh # 把需要排除的7个文件名用空格分隔列在这里 EXCLUDE_FILES="file1.txt file2.txt file3.txt file4.txt file5.txt file6.txt file7.txt" for file in "$Files"/*.txt; do # 提取文件名(去掉前面的路径) filename=$(basename "$file") # 检查当前文件是否在排除列表中,不在就设置权限 if ! echo "$EXCLUDE_FILES" | grep -qw "$filename"; then chmod 777 "$file" # 可选:打印提示,确认哪些文件被处理了 echo "已设置权限: $file" fi done
说明:grep -qw是精确匹配文件名,避免出现类似file1.txt和file11.txt被误判的情况。
方法2:用find命令高效处理(适合文件数量多的场景)
如果$Files目录下文件很多,用find命令会比循环更高效,它可以直接跳过指定文件:
#!/bin/sh # 定义要排除的文件,用-o连接多个-name条件 EXCLUDE_PATTERNS="( -name 'file1.txt' -o -name 'file2.txt' -o -name 'file3.txt' -o -name 'file4.txt' -o -name 'file5.txt' -o -name 'file6.txt' -o -name 'file7.txt' )" # 遍历$Files下的.txt文件,排除指定文件后执行chmod find "$Files" -type f -name "*.txt" $EXCLUDE_PATTERNS -prune -o -exec chmod 777 {} \; -print
说明:-prune会让find跳过匹配到的排除文件,-o表示“或者”,后面的-exec只处理没被排除的文件。-print是可选的,用来输出被处理的文件路径。
方法3:用bash扩展glob(最简洁,但依赖bash)
如果你的脚本可以改用bash(把开头的#!/bin/sh改成#!/bin/bash),可以用bash的扩展glob功能,写法非常简洁:
#!/bin/bash # 开启扩展glob和nullglob(避免没有匹配文件时出现错误) shopt -s extglob nullglob # !()表示匹配除括号内指定文件之外的所有.txt文件 for file in "$Files"/!(*file1.txt|*file2.txt|*file3.txt|*file4.txt|*file5.txt|*file6.txt|*file7.txt); do chmod 777 "$file" done
说明:extglob开启扩展匹配模式,nullglob确保当没有匹配到文件时,循环不会执行(避免出现$Files/!(*...)这样的字符串被当作文件名处理)。
内容的提问来源于stack exchange,提问作者james
相关产品推荐
相关产品推荐

