ファイルの権限を複製する標準的な方法


10

1つのファイルのアクセス許可を別のファイルに複製する標準の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フラグは非標準のオプションです。それは私の目的のためです。ワンライナーにしたいのですが、必須ではありません。最終的には、POSIX sh構文である必要があります。

回答:


7

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

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

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

デモ:

$ 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

これは興味深いアプローチです。これをテストして、さまざまなサーバーに対してどのように機能するかを確認します。それはトリックを行うように私には思えます。
Alexの

@Alex:懸念がある場合は、ファイルの所有権でもテストしてください。
追って通知があるまで一時停止。

最初のcpコマンドはcp has templatecp -pモードと所有権属性を保持するために使用する必要があります。
2014

@mernst:cpファイルの所有者/グループ(たとえば、「ユーザー」)がコピーを実行しているもの(たとえば、ルート)と異なる場合にのみ必要です。
追って通知があるまで一時停止。

@Dennis Willamson:わかりました、しかしそれは可能であり、私はcp -pそこで使用することにどんな欠点も見ません。
2014

12

statコマンドを使用して、ファイルの権限を取得できます。

  • Mac OS X(BSD)構文:

    chmod `stat -f%A fileWithPerm` fileToSetPerm

  • Linux構文(不明):

    chmod `stat -c%a fileWithPerm` fileToSetPerm

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


1
statPOSIXでは必須ではないと思います。多くの場合、利用できません。
追って通知があるまで一時停止。

stat(コマンドライン)はPOSIXではなく、移植性もありません。Dennis ++
jim mcnamara

1

ACLユーティリティgetfaclsetfaclはこの目的に使用できますが、このPOSIXが十分に準拠しているかどうかはわかりません。少なくともFreeBSD 8.0とLinuxでは機能しますが、一方でACLユーティリティをインストールする必要があるかもしれません。

マンページから:

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

getfaclとsetfaclは、ACLに加えて標準のファイル許可も操作できると思います。


ACLなどはPOSIXで定義されており、実装に固有であるため、準拠する必要はありません。
追って通知があるまで一時停止。

0

cp -p ファイルの権限を保持します。


1
そのため、私の回答のテクニック(を使用しない-p)は、ファイルの複製ではなく、別のファイルのアクセス許可を複製するというOPの要求に対して機能します。
追って通知があるまで一時停止。

0

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

ファイルアクセス許可は、struct stat st_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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.