सवाल मैं कमांड लाइन से ऑक्टल फ़ाइल अनुमति कैसे प्राप्त कर सकता हूं?


वहां एक है chmod फ़ाइल अनुमतियों को सेट करने के लिए आदेश, लेकिन क्या मैं कमांड लाइन से ऑक्टल मोड (जैसे 755) में फ़ाइल अनुमतियां प्राप्त कर सकता हूं?


316
2018-06-17 08:04


मूल




जवाब:


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

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/
    

(संदर्भ)


450
2018-06-17 08:08



मैक ओएस पर, उपयोग करें stat -f '%A %a %N' * (क्रेडिट: geeklog.adamwilson.info/article/58/...) - s2t2
यदि आप अधिक आरामदायक हैं ls: for f in $(ls -a); do stat -c "%a %n" $f; done; - usandfriends
@usandfriends के उत्पादन पर लूपिंग ls एक बुरा विचार है। यदि आप वास्तव में एक लूप का उपयोग करना चाहते हैं तो आप कर सकते हैं for f in *; do stat "%a %n" "$f"; done - Tom Fenech
मैक ओएस पर क्यों सबकुछ थोड़ा बदल गया है (यहां तक ​​कि यूनिक्स आईएसओ यूटिल में भी)? क्या इसका कोई वास्तविक कारण है? - Vassilis
कृपया @ हेकेल, हमें बताएं कि आप वास्तव में कैसा महसूस करते हैं। जबरदस्त हंसी! - MikeSchinkel


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

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

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

मानव पठनीय रूप में% पहुंच अधिकार

octal में एक एक्सेस अधिकार%

% एन फ़ाइल का नाम

अस्थायी संख्या और अनुमतियां

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

r: 4
w: 2
x: 1

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

ऑक्टल में फ़ाइल पर केवल पढ़ने और लिखने की अनुमति 0 + आर + डब्ल्यू + एक्स = 0 + 4 + 2 + 0 है   = 6

केवल ऑक्टल में फ़ाइल पर अनुमति को पढ़ने और निष्पादित करने के लिए 0 + आर + डब्ल्यू + एक्स = है   0 + 4 + 0 + 1 = 5

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

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

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


37
2018-06-17 08:14



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


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

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}'"

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


तय करना परिभाषित करना है 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}'; }

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


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

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

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


33
2018-06-17 08:12



निर्देशिकाओं के साथ काम नहीं करता है - awk: read error (Is a directory) - anatoly techtonik
@techtonik इसे इंगित करने के लिए धन्यवाद! मैंने (अंत में) इस उत्तर को अद्यतन करने के लिए एक फिक्स शामिल किया है। - Eliah Kagan
आप जोड़ सकते हो --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


पिछले 'stat' संबंधित उत्तरों को बस सरलीकृत करना:

आप बस दौड़ सकते हैं:

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--)


17
2017-08-26 16:07





पोर्टेबिलिटी के लिए, आप इसका उपयोग कर सकते हैं 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

6
2017-09-21 15:30



पोर्टेबल होने के अलावा, @ cuonglm का समाधान दिखाता है चार के बजाय octal पात्रों तीन, इस प्रकार "चिपचिपा बिट" की स्थिति दिखाती है जिसे अक्सर भूल जाता है। - jfmercer


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

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

find पथ -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 उपनिर्देशिका recurses, के समान 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 उपनाम, कौन कौन से वह जवाब उद्धृत, बस एक ही कमांड के रूप में चलाएं। यदि आप केवल एक बार या दुर्लभ अवसर पर इसका उपयोग कर रहे हैं, तो हो सकता है कि आप इसे उपनाम या खोल फ़ंक्शन के रूप में लिखना न चाहें।


2
2018-03-07 07:16