फ़ाइल अनुमतियाँ सेट करने के लिए एक chmod कमांड है, लेकिन क्या मुझे कमांड लाइन से ऑक्टल मोड (जैसे 755) में फ़ाइल अनुमति मिल सकती है?
stat --format "%A" $FILE
आपको मानव पठनीय drwxr-x---
प्रारूप देता है। जो उपयोगी हो या न हो।
फ़ाइल अनुमतियाँ सेट करने के लिए एक chmod कमांड है, लेकिन क्या मुझे कमांड लाइन से ऑक्टल मोड (जैसे 755) में फ़ाइल अनुमति मिल सकती है?
stat --format "%A" $FILE
आपको मानव पठनीय drwxr-x---
प्रारूप देता है। जो उपयोगी हो या न हो।
जवाबों:
तुम कोशिश कर सकते हो
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/
stat -f '%A %a %N' *
(क्रेडिट: geeklog.adamwilson.info/article/58/… )
ls
:for f in $(ls -a); do stat -c "%a %n" $f; done;
ls
एक बुरा विचार है। यदि आप वास्तव में एक लूप का उपयोग करना चाहते हैं, तो आप कर सकते हैंfor f in *; do stat "%a %n" "$f"; done
लिनक्स में फ़ाइल अनुमतियाँ लिनक्स स्टेट कमांड का उपयोग करके ऑक्टल प्रारूप में प्रदर्शित की जा सकती हैं।
बस प्रेस 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
AgileAdam.com पर एडम कोर्टेमंच द्वारा "755" -स्टाइल अनुमतियों के अनुसार विस्तृत विवरण में , आप एक ऐसा उपनाम बना सकते हैं जो कार्य करता है, लेकिन ऑक्टल में अनुमतियों को प्रदर्शित करने के लिए आउटपुट 1 को थोड़ा संसाधित करता है । यह तीन-अंकीय 2 ऑक्टल अनुमतियों को दर्शाने वाला एक अग्रणी स्तंभ जोड़ता है । जैसा कि लिखा गया है, यह ज्यादातर फ़ाइलों और निर्देशिकाओं के लिए काम करता है, लेकिन यह ठीक से काम नहीं करता है अगर चिपचिपा या सेट्यूड / सेटगिड बिट्स सेट किया जाता है। 3 lso
ls -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
के रूप में आप करने के लिए होगा उर्फ आदेश है, क्योंकि वे करने के लिए अतिरिक्त तर्क के रूप में लिया जाता है बजाय। इस प्रकार आप एक विशिष्ट फ़ाइल या निर्देशिका पर नहीं चल सकते , और न ही आप कोई विकल्प (जैसे , या ) पास कर सकते हैं ।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}'; }
एक उपनाम के रूप में परिभाषित करने में सीमा को इंगित करने के लिए टेकटोनिक के लिए धन्यवाद , इस प्रकार मुझे इसके बजाय इस समारोह को बनाने के लिए सामग्री के साथ इस पोस्ट का विस्तार करने के लिए प्रेरित किया।lso
1 ध्यान दें कि यह सामान्य नियम को आउटपुट से पार्स न करने के बारे में बताता हैls
। ls
बहुत मानव-पठनीय उत्पादन का उत्पादन करता है; यह अन्य आदेशों के लिए इनपुट के रूप में आम तौर पर अनुपयुक्त बनाने वाली पहचान और सीमाओं का परिचय देता है। इस मामले में,ls
जब से हमls
अपने एक जोड़ा परिवर्तन को छोड़कर सटीक व्यवहार को संरक्षित करना चाहते हैं, तब से हम पार्स करते हैं।
2 इस उपनाम की एक सीमा, जो इसके नीचे दिखाए गए फ़ंक्शन संस्करण पर भी लागू होती है, और जिसे बग माना जा सकता है, वह यह है कि यह केवल तीन अष्टक अंकों को प्रदर्शित करता है , जब चौथा अष्टक अंक शून्य होता है। जैसा कि jfmercer ने ठीक ही इंगित किया है , यहाँ प्रदर्शित ऑक्टल अंक चिपचिपे बिट को प्रदर्शित नहीं करते हैं यदि मौजूद है, और न ही सेटुइड या सेगिड बिट्स।
3 अधिक गंभीरता से केवल चौथे अष्टाधारी अंकों दिखाई नहीं दे रहा से इस विधि यह है कि मान लिया गया है कि वे सेट नहीं हैं, और यदि आप देखते हैं - अगर वे कर रहे हैं t
, s
या S
अनुमति स्ट्रिंग में - तो आप अष्टाधारी अंक उपेक्षा करना चाहिए । यह इसलिए है क्योंकि बिट्स अनुमत स्ट्रिंग से इस तरह से बांधे जाते हैं कि चिपचिपा सेतु / सेटगिड बिट्स के लिए खाता नहीं है।
awk: read error (Is a directory)
--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}'; }
पिछले 'स्टेट' से संबंधित उत्तरों को सरल बनाने के लिए:
आप बस चला सकते हैं:
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--)
पोर्टेबिलिटी के लिए, आप उपयोग कर सकते हैं 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
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
उर्फ के रूप में एक ही आदेश है , जो कि उत्तर देता है, बस एक ही आदेश के रूप में चलता है। यदि आप केवल एक बार या दुर्लभ अवसर पर इसका उपयोग कर रहे हैं, तो आप इसे एक उपनाम या शेल फ़ंक्शन के रूप में लिखने से परेशान नहीं करना चाहते हैं।