如何同时更改文件的权限和组所有者


9

对于更改文件许可权,我知道我可以使用chmod。要更改组所有者,可以使用chgrp。但是,如果我想同时更改权限和所有者,那么我可以在Linux上使用任何命令?

例如,存在一个具有此权限和所有者的文件:

-rw-r--r--+  1 raymondtau  staff    0 May  8 16:38 WantToChangeThisFile

现在,我想将其更改为:

---x-w--wx+  1 raymondtau  admin    0 May  8 16:38 WantToChangeThisFile

我知道我可以使用以下命令:chmod 123 WantToChangeThisFile && chgrp admin WantToChangeThisFile,但是想知道是否有任何巧妙的方法可以做到这一点。

Answers:


9

有一个称为“ UNIX-way”的概念。每个工具应执行一个简单的功能。如果需要更复杂的功能,则可以组合较小的工具。

相反,当所有功能都集中在一个巨大的工具中时,则是单片式设计。

如果您想做复杂的事情-只需编写脚本并调用简单的工具即可。


这是我编写的脚本,将这些工具组合为一个shell函数ch
基思(Keith)

2
没有办法是一个答案,他要问的是可以通过几个已经存在的工具来实现,例如rsync,尽管linux倾向于使用一个工具/一个功能,但这确实意味着不存在执行多种工作的工具
Kiwy

@Kiwy某些linux工具不符合unix-way原理,并且结合了不同性质的不同功能。例如以systemd为例。
Kondybas

1
@Kondybas“倾向于”是该句子的重要部分。该规则确实存在例外。您对我的回答仍然是一个非常糟糕的答案。
Kiwy

9

如果您还想要将文件复制到某个地方(例如最终目的地),则可能需要查看以下install命令:

install -m 0777 -o root $sourcefile $destinationfile


1

为* nix中的作业使用正确的工具很重要,但实际上在每个链接的命令中重复相同的路径看起来很愚蠢。相反,您应该真正使用Bash变量,并且在较小的脚本中,尤其要使用$_

您的命令将变为:

chmod 123 WantToChangeThisFile && chgrp admin $_

ALT +。做类似的事情来提取当前shell中最后使用的参数。


0

Rsync在这种情况下很有用:

摘自Fine Manual(TM)

--chown = USER:GROUP简单的用户名/组名映射

--chmod = CHMOD影响文件和/或目录权限

因此,例如,您要chmod / mnt / lala / lala4000 /“ ugo = rX”并添加“ foo.bar”

rsync --chmod = ugo = rX --chown = foo:bar -rvtpolgh / mnt / lala / lala4000 / / mnt / lala / lala4000 /

这将递归地对目录进行chown和chmod。


0

您可以通过长rsync命令 实现这样的目标

rsync -a --chown=root:root --chmod=F755 filename filename

我不明白
Pierre.Vriens

这是不安全的:它将影响指定目录和子目录中的所有匹配文件,而不仅仅是指向的文件。
telcoM

-1

您可以chown username:groupname file ...同时更改两者。它以相同的(inode)结构更改两个字段,因此结合起来可以节省两个系统调用(一个用于读取当前值,一个用于设置修改后的值)。


chown仅更改所有者。如何在OP请求的同时更改权限?注意OP的示例也包含一个chmod
jscott 2015年

啊,我想他要更改3件事,正如他写的那样。对于更改组所有者,我认为他的意思是组所有者。
Wurtel

-3
#!/bin/bash

# Setting the Variables for execution
LOGDIR=$HOME
CURRENTTIME=$(date +"%Y%m%d%s%H%M%S")
LOGFILE=${LOGDIR}/chgpermission_${CURRENTTIME}.log
MASTERFILE=$1
INDEX=0

# Checking the number of Parameters passed
if [ "$#" -ne 1 ]; then
    echo "Master file name is mandatory parameter" > ${LOGFILE}
    exit 1
fi

# Loading the Master file into an Array 
echo "Loading the Master file ${MASTERFILE} into an array" >> ${LOGFILE}
while read line
do
#echo $line  
MASTERARRAY[$INDEX]=$HOME/$line 
INDEX=$(expr $INDEX + 1) 
done < ${MASTERFILE}

echo "Number of parameters in an master array ${MASTERARRAY[@]}" >> ${LOGFILE}

# Changing the permission of the file 
echo "Changing the permission of the file in master file ${MASTERFILE}" >> ${LOGFILE} 
index=0
for index in "${MASTERARRAY[@]}"
do
    if [ -f "$index" ] 
    then
       echo "$index file exist"
       echo  "$index file exist" >> ${LOGFILE}
       chmod 755 "$index" 
       chown workstation "$index"
       chgrp workstation "$index" 
    else
      echo "$index file does not extst"
      echo "$index file does not exist" >> ${LOGFILE}  
    fi 
done 

2
您至少可以对它的工作原理以及应该如何使用进行解释(参数是多少...)
Kiwy

2
请不要仅粘贴一些代码作为答案。
康拉德·加耶夫斯基

评论不太可能富有成效;这是该用户发布的唯一内容,此后他们甚至没有登录。
G-Man说'恢复莫妮卡''18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.