2

Есть ли способ сделать файл A имеет точно такое же разрешение файла, как файл B, без указания разрешения, как 777. Например, я обычно ls файл B и проверьте его настройки разрешения. Тогда 'чмод ??? FiLea. Тем не менее, я ищу такую команду, как

chmod --argument_to_copy_file_permission fileA fileB

Пожалуйста, порекомендуйте.

РЕДАКТИРОВАТЬ: Кстати, есть ли команда, чтобы увидеть разрешение файла в цифровом режиме (например, 777), спасибо.

7 ответов7

5

chmod --reference=fileA fileB должен делать это в соответствии с man-страницей.

5

Это работает в Linux; Я не уверен, являются ли программы или опции POSIX.

chmod `stat -c '%a' fileB` fileA

На Mac OSX следующее работает примерно так же, но с использованием опций, которые работают. :)

chmod `stat -f '%Op' fileB` fileA

(Это заглавная буква "о", а не ноль.)

Опять же, я не знаю, что это за POSIX. Я знаю, что это не будет работать на Linux; опция -f означает что-то совершенно другое.

В любом случае обе команды работают, принимая выходные данные команды stat в fileB, в частности восьмеричные режимы файлов, и используют их в качестве режима для установки в fileA. Это означает, что материал между обратными кавычками даст вам режимы файлов.

2

Это довольно короткий Perl-скрипт:

my ($dev, $ino, $mode, @junk) = stat "fileA";
$mode &= 07777;  # mode includes type information in higher bits
printf "%o\n", $mode;
chmod $mode, "fileB";

Принятие аргументов и вариантов, оставленных читателю в качестве упражнения ...

1

Вроде, как бы, что-то вроде

$ chmod ugo=rwxrwxrwx filename

Таким образом, вы можете просто ввести отчет ls(1) или написать простой скрипт для этого.

Это будет работать на всех версиях Unix, включая Linux и Mac.

0

Вы можете передать вывод stat , изменить его, а затем использовать его для изменения прав доступа fileB:

stat fileA | grep "Access: (" | cut -c 10-13 | xargs -i  chmod {} fileB
0

Я немного дольше, чем скрипт на Perl:

chmod $(ls -l file.whose.permissions.you.want.to.copy | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf("%0o ",k);print}' | awk '{print $1}') 
0

Это также довольно короткий скрипт на Python:

import os
os.chmod('fileA', os.stat('fileB').st_mode)

И Руби:

File.chmod(File.stat('fileA').mode, 'fileB')

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .