【问题标题】:Issue with bash script setting parent folder permissions alsobash脚本设置父文件夹权限的问题也
【发布时间】:2020-06-12 08:55:45
【问题描述】:

我有一个 bash 脚本,它接受文件/文件夹的参数、编号的权限、用户和组。

它确定路径变量是文件还是文件夹,并相应地设置权限。

问题是当我传入一个文件夹时,它会将中的文件和文件夹本身设置为新用户和组。

如何只设置循环中的文件而不是文件夹

#!/bin/bash
path=$1
ocatal=$2
user=$3
group=$4
GREEN='\033[0;32m'
RED='\033[0;31m'
if [ $2 -gt 766 ]
then
   tput setaf 1
   echo -e "${RED}777 is not allowed!!! :-("
   tput sgr0
   exit 1   
else
    if [ -f "$path" ] 
    then
        chmod $2 $1
        chown ${3:=$(/usr/bin/id -run)}:$4 $1 
        tput setaf 2
        echo Permission set to $2
        echo User set to $3
        echo Group set to $4
        echo `ls -l $1`
    else
        for f in $path/*
        do
            chmod $2 $f
            chown ${3:=$(/usr/bin/id -run)}:$4 $f 
            tput setaf 2
            echo Permission set to $2
            echo User set to $3
            echo Group set to $4    
        done
        echo `ls -l $1`
    fi
   exit 0
fi

【问题讨论】:

  • "echo `ls -l $1`" 只是对echo的无用使用,只是ls -l "$1"

标签: linux bash file-permissions


【解决方案1】:

问题是当我传入一个文件夹时,它会设置其中的文件和 文件夹本身到新用户和组。

发生这种情况是因为这种模式 $path/* 也扩展到只是 $path/ 并且这会导致文件夹权限的更改。 * 表示任何文件(符号)或什么都没有,所以 $path 也在列表中。

更新,我在这里不太对,看起来这个问题只有在给定文件夹为空时才会发生,这里是带有空目录的测试回显

$ echo testdir/*
testdir/*

还有文件

$ echo testdir/*
testdir/file testdir/file2

考虑一下

[[  -d "$path" ]] && {
    cd "$path"
    chmod -f $ocatal *
    chown -f $user:$group *
    ...
    cd - # back to previous folder
}

-f 在文件夹为空的情况下抑制错误消息

并将此代码 DEF='\e[0m' 添加到您的颜色以设置默认颜色。

echo -e "${RED}777 is not allowed!!! :-($DEF"

【讨论】:

  • 问题:这是否替换了 for 循环代码?我假设 -d 是检查目录?我对 Linux bash 还是有点陌生​​
  • 是的,它是一个目录检查,如果它是一个目录 cd 到该目录并将 perms 更改为里面的所有文件,然后返回 cd -
  • @Ivan :您的解决方案当然有效,但也许您也可以指出,为什么 OP 使用的方法不起作用。
  • @user1934428,用这个解释更新了答案。
  • 非常感谢@Ivan 和 user1934428 的回答并解决了我遇到的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 2017-05-31
相关资源
最近更新 更多