फ़ाइल की अनुमतियों को डुप्लिकेट करने का मानक तरीका


10

मैं एक फ़ाइल की अनुमतियों को दूसरी फ़ाइल में डुप्लिकेट करने के लिए एक मानक 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 श सिंटैक्स में होना चाहिए।

जवाबों:


7

एक प्रलोभन है पार्स करना 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

अब यह एक दिलचस्प तरीका है। मैं इसका परीक्षण कर रहा हूं और देख रहा हूं कि यह विभिन्न सर्वरों के खिलाफ कितना अच्छा काम करता है। यह मुझे लगता है जैसे यह चाल चलेगा।
एलेक्स

@ एलेक्स: फ़ाइल स्वामित्व के साथ इसका परीक्षण करना सुनिश्चित करें, अगर यह एक चिंता का विषय है।
अगली सूचना तक रोक दिया गया।

मोड और स्वामित्व विशेषताओं को संरक्षित cp has templateकरने के cp -pलिए पहले cp कमांड का उपयोग करना चाहिए ।
मर्स्टन

@mernst: यह केवल तभी आवश्यक cpहै जब फ़ाइल का स्वामी / समूह (उदाहरण के लिए "उपयोगकर्ता") नकल करने वाले (जैसे रूट) से भिन्न हो।
अगली सूचना तक रोक दिया गया।

@ डेनिस विलमसन: ठीक है, लेकिन यह एक संभावना है और मुझे cp -pवहां उपयोग करने में कोई कमी नहीं दिखती ।
मर्नस्टॉक

12

आप statफ़ाइल की अनुमति प्राप्त करने के लिए कमांड का उपयोग कर सकते हैं :

  • मैक ओएस एक्स (बीएसडी) सिंटैक्स:

    chmod `स्टेट -f% A फ़ाइलविथपर्म` fileToSetPerm

  • लिनक्स सिंटैक्स (निश्चित नहीं):

    chmod `स्टेट -c% a fileWithPerm` fileToSetPerm

` प्रतीक एक backquote है।


1
मुझे नहीं लगता कि statपोसिक्स की आवश्यकता है। यह अक्सर उपलब्ध नहीं है।
अगली सूचना तक रोक दिया गया।

स्टेट (कमांड लाइन) POSIX नहीं है, और पोर्टेबल नहीं है। डेनिस ++
जिम् mcnamara

1

ACL उपयोगिताओं getfacl और setfacl का उपयोग इस उद्देश्य के लिए किया जा सकता है, लेकिन मुझे नहीं पता कि क्या यह POSIX पर्याप्त है। कम से कम फ्रीबीएसडी 8.0 और लिनक्स में काम करता है, लेकिन दूसरी तरफ एसीएल उपयोगिताओं को स्थापित करना पड़ सकता है।

मैन-पेज से:

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

मुझे लगता है कि getfacl और setfacl ACL के अलावा मानक फ़ाइल अनुमतियाँ भी संचालित कर सकते हैं।


ACLs और ऐसे POSIX द्वारा परिभाषित किए गए कार्यान्वयन-विशिष्ट हैं, इसलिए इसका अनुपालन आवश्यक नहीं है।
अगली सूचना तक रोक दिया गया।

0

cp -p फ़ाइल अनुमतियाँ संरक्षित करेगा।


1
इसीलिए मेरे उत्तर में तकनीक ( उपयोग करने की -p) काम करती है, जो ओपी चाहता है कि वह किसी अलग फाइल के लिए अनुमतियों की नकल करे , न कि फाइल की नकल की।
अगली सूचना तक रोक दिया गया।

0

एक पोर्टेबल, सीधा रास्ता एक मानक उपयोगिता नहीं है - आपको टेम्पलेटफाइल पर स्टेट () को कॉल करना होगा, फिर गंतव्य फ़ाइल (ओं) पर chmod ()। इसका मतलब है सी की तरह एक भाषा का उपयोग करना या पर्ल जैसी दूसरी व्यापक रूप से इस्तेमाल की जाने वाली भाषा।

फ़ाइल एक्सेस अनुमतियां 0007777 बिट्स द्वारा स्ट्रक्चर स्टेट st_mode सदस्य में निर्दिष्ट हैं। डेनिस का समाधान सही है, अगर 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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.