あるファイルのパーミッションを別のファイルに複製するための標準的な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構文である必要があります。
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
stat
コマンドを使用して、ファイルのアクセス許可を取得できます。
Mac OS X(BSD)構文:
chmod `stat -f%A fileWithPerm` fileToSetPerm
Linux構文(わからない):
chmod `stat -c%a fileWithPerm` fileToSetPerm
`記号はバッククォートです。
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つは、標準のユーティリティではありません。テンプレートファイルで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;
}
cp -p
ファイルのアクセス許可を保持します。