You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 16:37:38