web-dev-qa-db-ja.com

ファイルのパーミッションを複製する標準的な方法

あるファイルのパーミッションを別のファイルに複製するための標準的なPOSIXの方法を見つけようとしています。 GNUシステムでは、これは簡単です。

[alexmchale@bullfrog ~]$ ls -l hardcopy.*
-rw-r--r-- 1 alexmchale users 2972 Jul  8 20:40 hardcopy.1
---------- 1 alexmchale users 2824 May 14 13:45 hardcopy.4
[alexmchale@bullfrog ~]$ chmod --reference=hardcopy.1 hardcopy.4
[alexmchale@bullfrog ~]$ ls -l hardcopy.*
-rw-r--r-- 1 alexmchale users 2972 Jul  8 20:40 hardcopy.1
-rw-r--r-- 1 alexmchale users 2824 May 14 13:45 hardcopy.4

残念ながら、chmodへの--referenceフラグは非標準のオプションです。だから、それは私の目的のためです。私はそれがワンライナーであることを望みます、しかしそれは必要ではありません。最終的には、POSIXsh構文である必要があります。

10
Alex

1つの誘惑は、lsを解析することです。 その誘惑を避けてください

以下はうまくいくようですが、それはクルーゲでいっぱいです。これは、ターゲットファイルのアクセス許可を保持するcpに依存しています。このデモでは、ファイル「テンプレート」がまだ存在していてはなりません。

  • 必要な権限を持つファイルをnewファイルにコピーします
  • 変更するファイルを前の手順で作成したファイルにコピーします
  • 変更したい元のファイルを削除します
  • 中間ファイルの名前を変更するファイルの名前に変更します

デモ:

$ echo "contents of has">has
$ echo "contents of wants">wants
$ chmod ug+x has     # just so it's different - represents the desired permissions
$ cp has template
$ cat has
contents of has
$ cat wants
contents of wants
$ cat template
contents of has
$ ls -l has wants template
-rwxr-xr-- 1 user user 16 2010-07-31 09:22 has
-rwxr-xr-- 1 user user 16 2010-07-31 09:23 template
-rw-r--r-- 1 user user 18 2010-07-31 09:22 wants
$ cp wants template
$ ls -l has wants template
-rwxr-xr-- 1 user user 16 2010-07-31 09:22 has
-rwxr-xr-- 1 user user 18 2010-07-31 09:24 template
-rw-r--r-- 1 user user 18 2010-07-31 09:22 wants
$ cat template
contents of wants
$ rm wants
$ mv template wants
$ ls -l has wants
-rwxr-xr-- 1 user user 16 2010-07-31 09:22 has
-rwxr-xr-- 1 user user 18 2010-07-31 09:24 wants
$ cat has
contents of has
$ cat wants
contents of wants

statコマンドを使用して、ファイルのアクセス許可を取得できます。

  • Mac OS X(BSD)構文:

    chmod `stat -f%A fileWithPerm` fileToSetPerm

  • Linux構文(わからない):

    chmod `stat -c%a fileWithPerm` fileToSetPerm

`記号はバッククォートです。

11
Studer

ACLユーティリティgetfaclおよびsetfaclはこの目的に使用できますが、このPOSIXに十分準拠しているかどうかはわかりません。少なくともFreeBSD8.0とLinuxで動作しますが、一方でACLユーティリティをインストールする必要があるかもしれません。

マニュアルページから:

getfacl file1 | setfacl -b -n -M - file2
Copy ACL entries from file1 to file2.

Getfaclとsetfaclは、ACLに加えて、標準のファイルパーミッションも操作できると思います。

1

ポータブルで簡単な方法の1つは、標準のユーティリティではありません。テンプレートファイルでstat()を呼び出してから、宛先ファイルでchmod()を呼び出す必要があります。これは、Cのような言語またはPerlのような他の広く使用されている言語を使用することを意味します。

ファイルアクセス許可は、struct statst_modeメンバーで0007777ビットで指定されます。デニスのソリューションは正しいですが、I/Oが少し重い場合は、非常に大きなファイルの場合は失敗する可能性があります。

cp has template

この本番環境に対応していない例を考えてみましょう。

#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

mode_t 
getperm(const char *template_file)
{
    struct stat st;
    if(stat(template_file, &st)==-1)
    {
       perror("Cannot stat file");
       exit(1);
    }
    return st.st_mode;
}

int main(int argc, char **argv)
{    
    mode_t mode=getperm(argv[1]);
    int i=0;
    for(i=2; argv[i]!=NULL; i++)    
    {
       if(chmod(argv[i], mode)==-1)
          fprintf(stderr, "Permissions failed on %s:\n\t%s\n",
              argv[i], strerror(errno));
    }       
    return 0;
}
0
jim mcnamara

cp -pファイルのアクセス許可を保持します。

0
user31894