Как изменить разрешение и группу-владельца файла одновременно

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но хочу знать, есть ли какой-нибудь изящный способ сделать это.

Раймонд Тау
источник

Ответы:

9

Существует понятие, известное как «UNIX-way». Каждый инструмент должен выполнять одну простую функцию. Если кому-то нужна более сложная функция, он может комбинировать меньшие инструменты.

Противоположностью является монолитный дизайн, когда все функциональные возможности объединены в одном огромном инструменте.

Если вы хотите сделать что-то сложное - просто напишите сценарий, используя простые инструменты.

Kondybas
источник
Вот сценарий, который я написал, который объединяет эти инструменты в одну функцию оболочки ch.
Кит
2
нет никакого ответа, то, что он спросил, можно было бы достичь с помощью нескольких уже существующих инструментов, таких как rsync, и хотя linux предпочитает использовать одну функцию / одну функцию, это означает, что инструменты, выполняющие несколько
операций,
@Kiwy Некоторые инструменты Linux не соответствуют принципам Unix-Way и объединяют различные функции различной природы. Как например systemd.
Кондыбас
1
@Kondybas "как правило" является важной частью предложения. Исключение из правила существует. Тем не менее ваш ответ мне действительно плохой.
Киви
9

Если вам также нужно скопировать файл куда-нибудь (например, в конечный пункт назначения), вы можете посмотреть на install команду:

install -m 0777 -o root $sourcefile $destinationfile

Конрад Гаевский
источник
1

Использование правильного инструмента для работы в * nix очень важно, но повторять один и тот же путь в каждой цепочке команд выглядит глупо. Вместо этого вы должны действительно использовать переменные Bash, а в небольших скриптах, особенно, использовать $_.

Ваша команда станет:

chmod 123 WantToChangeThisFile && chgrp admin $_

ALT +. делает то же самое, вытягивая последний использованный аргумент в вашей текущей оболочке.

Zebouski
источник
0

Rsync полезен в этом случае:

Из тонкого руководства (ТМ)

--chown = USER: сопоставление простого имени пользователя / группы GROUP

--chmod = CHMOD влияет на права доступа к файлу и / или каталогу

Так, например, вы хотите chmod / mnt / lala / lala4000 / "ugo = rX" и chown "foo.bar"

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

Это будет рекурсивно сокращено и chmod dir.

purpaboo
источник
0

Вы могли бы достичь такой цели с длинной rsyncкомандой

rsync -a --chown=root:root --chmod=F755 filename filename
Верн
источник
я не понимаю
Pierre.Vriens
Это небезопасно: это повлияет на все соответствующие файлы в указанном каталоге и подкаталогах, а не только на один файл, на который он указывает.
Телеком
-1

Вы можете сделать, chown username:groupname file ...чтобы изменить оба одновременно. Он изменяет два поля в одной и той же (inode) структуре, поэтому при объединении он сохраняет два системных вызова (одно для чтения текущих значений и одно для установки измененных значений).

wurtel
источник
chownтолько меняет владельцев. Как это меняет разрешения одновременно с запросом OP? Примечание. Пример OP также включает chmodв себя.
Jscott
Ах, я думаю, он хотел изменить 3 вещи, как он писал « Для смены владельца группы я думал, что он имел в виду группу и владельца».
Вюртель
-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 говорит «Восстановить Монику»