मुझे कमांड लाइन से ऑक्टल फ़ाइल की अनुमति कैसे मिल सकती है?


373

फ़ाइल अनुमतियाँ सेट करने के लिए एक chmod कमांड है, लेकिन क्या मुझे कमांड लाइन से ऑक्टल मोड (जैसे 755) में फ़ाइल अनुमति मिल सकती है?


2
मेरे जैसे लोगों के लिए जो गलती से इस पेज पर आ गए थे, लेकिन वास्तव में मैक पर ऐसा करने के लिए खोज कर रहे थे: stackoverflow.com/a/14855227/470749
रायन

2
stat --format "%A" $FILEआपको मानव पठनीय drwxr-x---प्रारूप देता है। जो उपयोगी हो या न हो।
ट्रेवर बॉयड स्मिथ

जवाबों:


535

तुम कोशिश कर सकते हो

stat -c "%a %n" *

*संबंधित निर्देशिका या सटीक फ़ाइल नाम से बदलें जिसे आप जांचना चाहते हैं।

से स्टेट मैन ऑफ द पेज ,

-c  --format=FORMAT
          use  the  specified  FORMAT instead of the default; output a newline after
          each use of FORMAT
%a     Access rights in octal
%n     File name

उपयोग:

  • फ़ाइलों के साथ:

    $ stat -c "%a %n" ./Documents/Udev.html 
    664 ./Documents/Udev.html
    
  • फ़ोल्डर के साथ:

    $ stat -c "%a %n" ./Documents/
    755 ./Documents/
    

(संदर्भ)


57
मैक ओएस पर, उपयोग stat -f '%A %a %N' *(क्रेडिट: geeklog.adamwilson.info/article/58/… )
s2t2

1
यदि आप इसके साथ अधिक सहज हैं ls:for f in $(ls -a); do stat -c "%a %n" $f; done;
usandfriends

2
@usandfriends के आउटपुट पर लूपिंग lsएक बुरा विचार है। यदि आप वास्तव में एक लूप का उपयोग करना चाहते हैं, तो आप कर सकते हैंfor f in *; do stat "%a %n" "$f"; done
टॉम फेनेच

1
क्यों मैक ओएस पर सब कुछ थोड़ा बदल जाता है (यहां तक ​​कि यूनिक्स आइसो बर्तनों में भी)? क्या इसका कोई वास्तविक कारण है?
वासिलिस

2
कृपया @ हेकेल, हमें बताएं कि आप वास्तव में कैसा महसूस करते हैं। जबरदस्त हंसी!
माइकस्किंकेल

44

लिनक्स में फ़ाइल अनुमतियाँ लिनक्स स्टेट कमांड का उपयोग करके ऑक्टल प्रारूप में प्रदर्शित की जा सकती हैं।

बस प्रेस Ctrl+ Alt+ Tअपने कीबोर्ड पर टर्मिनल खोलने के लिए। जब यह खुलता है, तो उस निर्देशिका पर नेविगेट करें जहां आप ऑक्टल मोड में फ़ाइल अनुमतियों को खोजना चाहते हैं।

stat -c '%A %a %n' *

% मानव पठनीय रूप में एक प्रवेश अधिकार

अष्टक में एक एक्सेस अधिकार

% n फ़ाइल नाम

अष्टक संख्या और अनुमति

मोड / अनुमति का प्रतिनिधित्व करने के लिए आप ऑक्टल नंबर का उपयोग कर सकते हैं:

r: 4
w: 2
x: 1

उदाहरण के लिए, फ़ाइल स्वामी के लिए आप निम्नानुसार ऑक्टल मोड का उपयोग कर सकते हैं। अष्टक में एक फ़ाइल पर पढ़ें, लिखें और निष्पादित करें (पूर्ण) अनुमति 0 + r + w + x = 0 + 4 + 2 + 1 = 7 है

ओक्टल में केवल एक फाइल पर अनुमति पढ़ें और लिखें 0 + r + w + x = 0 + 4 + 2 + 0 = 6 है

केवल ओक्टल में एक फ़ाइल पर अनुमति को पढ़ने और निष्पादित करने के लिए 0 + r + w + x = 0 + 4 + 0 + 1 = 5 है

समूह और अन्य के लिए अनुमति की गणना करने के लिए उपरोक्त विधि का उपयोग करें। आइए हम कहते हैं कि आप स्वामी को पूर्ण अनुमति देना चाहते हैं, समूह की अनुमति को पढ़ना और निष्पादित करना, और केवल दूसरों को अनुमति देना पढ़ें, तो आपको निम्नानुसार अनुमति की गणना करने की आवश्यकता है: उपयोगकर्ता = r + w + x = 0 + 4 + 2 + 1 = 7 समूह = r + w + x = 0 + 4 + 2 + 0 = 6 अन्य = r + w + x = 0 + 0 + 0 + 1 = 1

प्रभावी अनुमति 761 है।

स्रोत: http://kmaiti.blogspot.com/2011/09/umask-concept.html


2
प्रारंभिक 0 विशेष बिट का भी प्रतिनिधित्व करता है: pastebin.com/6ymkFt71
Braiam

36

AgileAdam.com पर एडम कोर्टेमंच द्वारा "755" -स्टाइल अनुमतियों के अनुसार विस्तृत विवरण में , आप एक ऐसा उपनाम बना सकते हैं जो कार्य करता है, लेकिन ऑक्टल में अनुमतियों को प्रदर्शित करने के लिए आउटपुट 1 को थोड़ा संसाधित करता है । यह तीन-अंकीय 2 ऑक्टल अनुमतियों को दर्शाने वाला एक अग्रणी स्तंभ जोड़ता है । जैसा कि लिखा गया है, यह ज्यादातर फ़ाइलों और निर्देशिकाओं के लिए काम करता है, लेकिन यह ठीक से काम नहीं करता है अगर चिपचिपा या सेट्यूड / सेटगिड बिट्स सेट किया जाता है। 3 lsols -l

alias lso="ls -alG | 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}'"

यह एक गंभीर कमी है, हालांकि, जैसा कि टेकटोनिक बताते हैं । आप तर्क पारित नहीं हो सकता यह करने के लिए lsoके रूप में आप करने के लिए होगा उर्फ आदेश है, क्योंकि वे करने के लिए अतिरिक्त तर्क के रूप में लिया जाता है बजाय। इस प्रकार आप एक विशिष्ट फ़ाइल या निर्देशिका पर नहीं चल सकते , और न ही आप कोई विकल्प (जैसे , या ) पास कर सकते हैं ।lsawklso-F--colorlso


फिक्स एक उपनाम के बजाय lso एक फ़ंक्शन के रूप में परिभाषित करना है ।

lso() { ls -alG "$@" | 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}'; }

यदि आप इसे अपने शेल में अंतःक्रियात्मक रूप से आज़मा रहे हैं, unalias lsoतो उपनाम को हटाने के लिए दौड़ें - आप फ़ंक्शन को परिभाषित करने से पहले या बाद में भी ऐसा कर सकते हैं। यदि आप इसे किसी ऐसी फ़ाइल में डाल रहे हैं, जो कि खट्टी है, जैसे कि ~/.bashrc, बस aliasलाइन से बाहर निकालें और फ़ंक्शन की परिभाषा जोड़ें।

यह काम क्यों करता है? उपनामों के विपरीत, बैश शैल फ़ंक्शंस में स्थितीय पैरामीटर , यानी, कमांड-लाइन तर्क ले सकते हैं"$@"पूर्ण तर्क सूची में फैलता है , जिससे lsoफ़ंक्शन को तर्क पारित किया जा सकता है ls। (अन्य उपनाम के विपरीत, एक फ़ंक्शन बॉडी को उद्धृत नहीं किया जाता है; इसलिए \पहले वर्णों को हटाना आवश्यक था $और ")।

चूँकि आप lsoफ़ंक्शन के रूप में इस तरह परिभाषित करने के लिए विकल्प पास कर सकते हैं , आप परिभाषा से विकल्पों -aऔर -Gविकल्पों को हटाने की इच्छा कर सकते हैं - आप उन्हें उन मामलों में मैन्युअल रूप से पास कर सकते हैं जहाँ आप उन्हें चाहते हैं। ( विकल्प फाइल अनुमति जैसे विवरण के लिए आवश्यक है दिखाया जा सकता है सब पर है, इसलिए इसे हटाने के लिए कोई लाभ नहीं है।)-l

lso() { ls -l "$@" | 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}'; }

एक उपनाम के रूप में परिभाषित करने में सीमा को इंगित करने के लिए टेकटोनिक के लिए धन्यवाद , इस प्रकार मुझे इसके बजाय इस समारोह को बनाने के लिए सामग्री के साथ इस पोस्ट का विस्तार करने के लिए प्रेरित किया।lso


1 ध्यान दें कि यह सामान्य नियम को आउटपुट से पार्स न करने के बारे में बताता हैlslsबहुत मानव-पठनीय उत्पादन का उत्पादन करता है; यह अन्य आदेशों के लिए इनपुट के रूप में आम तौर पर अनुपयुक्त बनाने वाली पहचान और सीमाओं का परिचय देता है। इस मामले में,ls जब से हमls अपने एक जोड़ा परिवर्तन को छोड़कर सटीक व्यवहार को संरक्षित करना चाहते हैं, तब से हम पार्स करते हैं।

2 इस उपनाम की एक सीमा, जो इसके नीचे दिखाए गए फ़ंक्शन संस्करण पर भी लागू होती है, और जिसे बग माना जा सकता है, वह यह है कि यह केवल तीन अष्टक अंकों को प्रदर्शित करता है , जब चौथा अष्टक अंक शून्य होता है। जैसा कि jfmercer ने ठीक ही इंगित किया है , यहाँ प्रदर्शित ऑक्टल अंक चिपचिपे बिट को प्रदर्शित नहीं करते हैं यदि मौजूद है, और न ही सेटुइड या सेगिड बिट्स।

3 अधिक गंभीरता से केवल चौथे अष्टाधारी अंकों दिखाई नहीं दे रहा से इस विधि यह है कि मान लिया गया है कि वे सेट नहीं हैं, और यदि आप देखते हैं - अगर वे कर रहे हैं t, sया Sअनुमति स्ट्रिंग में - तो आप अष्टाधारी अंक उपेक्षा करना चाहिए । यह इसलिए है क्योंकि बिट्स अनुमत स्ट्रिंग से इस तरह से बांधे जाते हैं कि चिपचिपा सेतु / सेटगिड बिट्स के लिए खाता नहीं है।


निर्देशिकाओं के साथ काम नहीं करता है -awk: read error (Is a directory)
एनाटोली टेकटोनिक

@techtonik यह इंगित करने के लिए धन्यवाद! मैंने (अंत में) उस के लिए एक फिक्स शामिल करने के लिए इस उत्तर को अपडेट किया है।
एलियाह कगन

1
आप --colorशो कलर्स के लिए पैरामीटर जोड़ सकते हैंlso() { ls -alG "$@" --color | 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}'; }
tagplus5

1
क्या आपने इसे पोस्ट करने के बाद से चिपचिपा सेतु / सेटगिड समस्या का हल खोज लिया है?
सिल्वेस्टरिस

21

पिछले 'स्टेट' से संबंधित उत्तरों को सरल बनाने के लिए:

आप बस चला सकते हैं:

stat <path_to_file>

आउटपुट में अन्य जानकारी के साथ ऑक्टल अनुमति शामिल होगी।



विवरण (स्टेट संस्करण और उदाहरण):

# stat --version
stat (GNU coreutils) 8.4


[user@localhost ~]# touch /tmp/TEST_PERMISSONS

[user@localhost ~]# chmod 644 /tmp/TEST_PERMISSONS

[user@localhost ~]# stat /tmp/TEST_PERMISSONS
  File: `/tmp/TEST_PERMISSONS'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 1010058     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-08-26 18:58:59.000000000 +0300
Modify: 2015-08-26 18:58:59.000000000 +0300
Change: 2015-08-26 18:59:16.000000000 +0300

नोट: ( 0644 / -rw-r - r--)


6

पोर्टेबिलिटी के लिए, आप उपयोग कर सकते हैं perl:

$ perl -e 'printf "%04o %s\n", (stat)[2] & 07777, $_ for @ARGV' *.txt
0644 1.txt
0644 2.txt
0644 3.txt
0644 4.txt
0600 PerlOneLiner.txt
0664 perl.txt

यदि आप नोटिस करना चाहते हैं जब कोई त्रुटि होती है, तो प्रयास करें:

perl -e '
for (@ARGV) {
    print "$!: $_\n" and next unless -e;
    printf "%03o %s\n", (stat)[2] & 07777, $_;
}
' *.txt

2
पोर्टेबल होने के अलावा, @ cuonglm का समाधान तीन के बजाय चार अष्टक वर्ण दिखाता है , इस प्रकार "चिपचिपा सा" की स्थिति को दर्शाता है जो अक्सर भूल जाता है।
जफमेर

2

आप कार्रवाई के findसाथ उपयोग कर सकते हैं -printf

lsऑक्टेल अनुमतियां नहीं दिखाता है, लेकिन आप इस- findआधारित वर्कअराउंड का उपयोग कर सकते हैं :

find path -printf "%m:%f\n"

उदाहरण के लिए, मेरे वीडियो निर्देशिका की जांच करने के लिए:

$ find Videos -printf "%m:%f\n"
755:Videos

%mफॉर्मेट स्पेसिफायर बताता -printfकार्रवाई अष्टाधारी अनुमतियाँ मुद्रित करने के लिए है, जबकि %fफॉर्मेट स्पेसिफायर फ़ाइल नाम मुद्रित करने के लिए यह कारण बनता है।

आप कई फ़ाइल नाम पास कर सकते हैं find। आप ग्लब्स (जैसे, find * -printf "%m:%f\n") का भी उपयोग कर सकते हैं ।

आपको परीक्षण का उपयोग करने की आवश्यकता नहीं है जैसे -nameया -iname; यह उन फाइलों या निर्देशिकाओं के नामों को पारित करने के लिए पर्याप्त है जिन्हें आप शुरुआती बिंदुओं के रूप में रुचि रखते हैं find। यही है, शब्द के तुरंत बाद उनके नाम की आपूर्ति करें find, जैसा कि ऊपर दिखाया गया है।

findयह उत्पादन कैसे दिखाता है इस पर आपको बहुत नियंत्रण देता है। विशेष रूप से दो संशोधन हैं जो आपको उपयोगी लग सकते हैं:

  • डिफ़ॉल्ट रूप से, findइसी तरह के उपनिर्देशिका का पुनरावर्तन करता है ls -R। यदि आप इसके द्वारा पास किए findजाने वाले शुरुआती बिंदुओं के उपनिर्देशों का दौरा नहीं करना चाहते हैं , तो आप यह इंगित करने के लिए जोड़ सकते हैं -maxdepth 0(या -maxdepthअन्य मूल्यों के साथ उपयोग कर सकते हैं कि आप इसे कितना गहरा चाहते हैं)।

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • %fकेवल एक फ़ाइल नाम दिखाता है, इसलिए यदि findकिसी फ़ाइल को प्राप्त करने के लिए पुनरावृत्ति करना है, तो आप यह नहीं जान सकते कि यह कहाँ स्थित है। एक रास्ता दिखाने के लिए, जो भी शुरुआती बिंदु के साथ शुरुआत फ़ाइल के नीचे पाया गया था, %pइसके बजाय उपयोग करें ।

    $ find /boot -printf "%m:%p\n"
    755:/boot
    644:/boot/initrd.img-4.4.0-92-generic
    600:/boot/System.map-4.4.0-93-generic
    600:/boot/vmlinuz-4.4.0-92-generic
    600:/boot/vmlinuz-4.4.0-93-generic
    ....

कमांड man findका उपयोग करने के बारे में अधिक जानकारी के लिए देखें find

एक और तरीका ( lsऔर awk)

यह उनकी अनुमति के साथ सभी निर्देशिका फ़ाइलों को सूचीबद्ध करने के लिए इस्तेमाल किया जा सकता है:

ls -l | 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}'

यह अनिवार्य रूप से एडम कोर्टेमंच के lsoउर्फ के रूप में एक ही आदेश है , जो कि उत्तर देता है, बस एक ही आदेश के रूप में चलता है। यदि आप केवल एक बार या दुर्लभ अवसर पर इसका उपयोग कर रहे हैं, तो आप इसे एक उपनाम या शेल फ़ंक्शन के रूप में लिखने से परेशान नहीं करना चाहते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.