यूनिक्स सूची कमांड 'ls' आउटपुट संख्यात्मक chmod अनुमतियाँ कर सकते हैं?


192

क्या प्रतीकात्मक आउटपुट -rw-rw-r-- के बजाय 644 जैसे संख्यात्मक यूनिक्स अनुमतियों को देखने के लिए निर्देशिका को सूचीबद्ध करना संभव है।

धन्यवाद।

जवाबों:


351

यह लगभग कर सकते हैं ..

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

32
इसे एक उपनाम के रूप में बनाने के लिए (नीचे उदाहरण: 'cls' कमांड), उपयोग करें: alias cls="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}'"
खतरे as

6
मैंने खतरे से रेखा को कॉपी और पेस्ट किया है और पाया कि अजीब तरह से आउटपुट 7% कहने के बजाय% 0..o प्रति पंक्ति के साथ शुरू हुआ। अगर किसी और को यह आता है, तो इसका कारण 0 और o के बीच एक छिपा हुआ चरित्र प्रतीत होता है। एक बार हटाए जाने के बाद कमांड को अच्छी तरह सेट किया जाता है। चीयर्स!
डोना

मुझे लगता है कि एक गणना मुद्दा है। बाद chmod 777 dirअपने आदेश के रूप में अनुमतियाँ प्रिंट767
जूलियन एफ Weinert

जैसा कि डोना का उल्लेख है, 0 और ओ के बीच एक अजीब चरित्र (या 2) है, साथ ही, अजीब तरह से ऐसा लगता है कि एसओ इसे जोड़ रहा है ...
nbsp

3
यह बिट्स टी और एस को पहचानने में विफल रहता है। फ़ाइल अनुमति की जानकारी प्राप्त करने के लिए आपको 'स्टेट' कमांड का उपयोग करना चाहिए। इसे हाथ से गणना करने से त्रुटियां होंगी!
इवान लैंग्लोइस

157

क्लोज़ेस्ट मैं सोच सकता हूं (इसे सरल रखना) stat, यह मानते हुए कि आप जानते हैं कि आप किन फ़ाइलों की तलाश कर रहे हैं। यदि आप नहीं करते हैं, तो *उनमें से अधिकांश मिल सकते हैं:

/usr/bin$ stat -c '%a %n' *
755 [
755 a2p
755 a2ps
755 aclocal
...

यह बॉक्स से बाहर चिपचिपा, सुसाइड और कंपनी को संभालता है:

$ stat -c '%a %n' /tmp /usr/bin/sudo
1777 /tmp
4755 /usr/bin/sudo

21
यह लिनक्स के तहत बहुत अच्छा काम करता है, मैंने पाया stat -f '%A %N' *कि मैक (FreeBSD) पर यही काम करता है
reevesy

2
मुझे लगता है कि तर्क है कि है statनहीं है lsइसलिए इस सही जवाब नहीं है। हालांकि, मेरा मानना ​​है कि यह वांछित आउटपुट के संदर्भ में सही उत्तर है। यदि awkएक पाइप में अनुमति दी जाती है, तो findअनुमति दी जानी चाहिए कि कहां statकहा जाता है -exec; तो आप statसीधे बिना उपयोग कर सकते हैं*
javafueled

2
यह बहुत बेहतर है और किसी भी प्रणाली पर काम करने वाले 100%
कंगारू

यदि आप स्टेट्स को पुनरावर्ती रूप से, बैश के तहत, देखने के लिए स्टेट का उपयोग करना चाहते हैं stat -c '%a %n' * **/*
डेनिस शेवेलियर

61

आप बस GNU खोज का उपयोग कर सकते हैं।

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

यह एक ऐसी आज्ञा है जिसे मैं वास्तव में याद रख सकता हूं। सहायक और प्रभावी।
ट्रेंट

5
इसके पास -maxdepth 1विकल्प भी होना चाहिए , अन्यथा यह पूरी निर्देशिका ट्री का पता लगाता है।
रुस्लान

37

आप निम्न कमांड का उपयोग कर सकते हैं

stat -c "%a %n" *

इसके अलावा, आप एक विशिष्ट परिणाम प्राप्त करने के लिए किसी भी filenameया directorynameइसके बजाय का उपयोग कर सकते हैं *

मैक पर, आप उपयोग कर सकते हैं

stat -f '%A %N' *

1
मेरे लिए काम नहीं किया। stat: illegal option -- c usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
rschwieb

1
ubuntu 14.04 पर काम करता है .. यह याद रखने के लिए कभी नहीं कि मैंने अपने .bashrc में एक उपनाम जोड़ा है: alias xxx = "stat -c '% a% n' *"
faeb187

2
सहायक! आप इसे कैसे खोदते हैं% A जो मैक पर स्टेट ऑफ मैन में भी नहीं दिखता है?
इगोनजैक

1
यह वास्तव में एक FreeBSD कमांड है, और मैक सिर्फ ऊपरी कर्नेल के रूप में इसका उपयोग करने पर निर्मित होता है।
मोहम्मद अब्दुल मुजीब

यदि हम केवल man statmacOS 10.14.4 पर प्रस्तुत जानकारी का उपयोग करते हैं , तो कमांड होना चाहिए stat -f "%Lp %N" *%Lpके रूप में एक ही बात को मुद्रित करने के लिए प्रकट होता है %A
सीजर आंद्रेउ

17

@ द मायन्यू

वाह, अच्छा जाग! लेकिन suid, sgid और चिपचिपा बिट के बारे में क्या?

आपको अपने फ़िल्टर को एस और टी के साथ विस्तारित करना होगा, अन्यथा वे गिनती नहीं करेंगे और आपको गलत परिणाम मिलेगा। इस विशेष झंडे के लिए ऑक्टल संख्या की गणना करने के लिए, प्रक्रिया समान है, लेकिन सूचकांक 4 7 और 10. पर है। बिट्स सेट के साथ फाइलों के लिए संभावित झंडे अमल के ---s--s--tलिए फाइलों के लिए amd हैं जिनमें कोई बिट सेट नहीं है।---S--S--T

ls -l | awk '{
    k = 0
    s = 0
    for( i = 0; i <= 8; i++ )
    {
        k += ( ( substr( $1, i+2, 1 ) ~ /[rwxst]/ ) * 2 ^( 8 - i ) )
    }
    j = 4 
    for( i = 4; i <= 10; i += 3 )
    {
        s += ( ( substr( $1, i, 1 ) ~ /[stST]/ ) * j )
        j/=2
    }
    if ( k )
    {
        printf( "%0o%0o ", s, k )
    }
    print
}'  

परीक्षण के लिए:

touch blah
chmod 7444 blah

में परिणाम होगा:

7444 -r-Sr-Sr-T 1 cheko cheko   0 2009-12-05 01:03 blah

तथा

touch blah
chmod 7555 blah

दे देंगे:

7555 -r-sr-sr-t 1 cheko cheko   0 2009-12-05 01:03 blah

3
+1 धन्यवाद! मैंने इसे 1-पंक्ति के उपनाम से छोटा कर दिया:alias "lsmod=ls -al|awk '{k=0;s=0;for(i=0;i<=8;i++){;k+=((substr(\$1,i+2,1)~/[rwxst]/)*2^(8-i));};j=4;for(i=4;i<=10;i+=3){;s+=((substr(\$1,i,1)~/[stST]/)*j);j/=2;};if(k){;printf(\"%0o%0o \",s,k);};print;}'"
जीरो वेर्ट प्लुइमर

+1 ने काम की फ़ाइल अनुमतियों को पुनर्स्थापित करने के लिए विचार को आगे बढ़ाया: ysgitdiary.blogspot.fi/2013/04/…
Yordan Georgiev

5
अलसी के रूप में lsmod का उपयोग न करें .. जो कर्नेल मॉड्स को सूचीबद्ध करने के लिए एक ज्ञात पॉज़िक्स कमांड है।
छत्तीस

@JeroenWiertPluimers जो मुझे awk से एक सिंटैक्स त्रुटि दे रहा है
इवान लैंग्लोइस

@EvanLanglois इसलिए एक नया प्रश्न पूछें।
जीरोन विर्ट प्लिमर्स

10

यूनिक्स संख्यात्मक अनुमति मूल्यों (ओक्टल मान) और फ़ाइल नाम को प्रदर्शित करने के लिए इसका उपयोग करें।

stat -c '%a %n' *

यूनिक्स संख्यात्मक अनुमति मूल्यों (अष्टाधारी मूल्यों) और फ़ोल्डर के sgid और चिपचिपा बिट, मालिक का उपयोगकर्ता नाम, समूह का नाम, बाइट्स में कुल आकार और फ़ाइल नाम प्रदर्शित करने के लिए इसका उपयोग करें।

stat -c '%a %A %U %G %s %n' *

यहाँ छवि विवरण दर्ज करें

%yयदि आपको मानव-पठनीय प्रारूप में अंतिम संशोधन का समय चाहिए तो जोड़ें । अधिक विकल्पों के लिए स्टेट देखें ।

एक उपनाम का उपयोग कर बेहतर संस्करण

एक उपनाम का उपयोग करना एक अधिक कुशल तरीका है जिसे आपको ज़रूरत है और यह रंग भी शामिल करता है। निम्नलिखित समूह निर्देशिकाओं द्वारा आयोजित आपके परिणामों को पहले प्रदर्शित करता है, रंग में प्रदर्शित करता है, मानव पठनीय प्रारूप में प्रिंट आकार (उदाहरण के लिए, 1K 234M 2G) अपना संपादन करता है ~/.bashrcऔर अपने खाते के लिए या वैश्विक रूप से संपादन करके उपनाम जोड़ता है/etc/profile.d/custom.sh

टंकण clsआपके नए LS कमांड परिणाम प्रदर्शित करता है।

alias cls="ls -lha --color=always -F --group-directories-first |awk '{k=0;s=0;for(i=0;i<=8;i++){;k+=((substr(\$1,i+2,1)~/[rwxst]/)*2^(8-i));};j=4;for(i=4;i<=10;i+=3){;s+=((substr(\$1,i,1)~/[stST]/)*j);j/=2;};if(k){;printf(\"%0o%0o \",s,k);};print;}'"

उपनाम सबसे कुशल उपाय है

फोल्डर ट्री

जब आप अपने bashrc या custom.sh को संपादित कर रहे हैं, तो एक चित्रमय प्रतिनिधित्व देखने के लिए निम्नलिखित उपनाम शामिल करें जहां टाइपिंग lstreeआपके वर्तमान फ़ोल्डर ट्री संरचना को प्रदर्शित करेगा

alias lstree="ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'"

यह प्रदर्शित होगा:

   |-scripts
   |--mod_cache_disk
   |--mod_cache_d
   |---logs
   |-run_win
   |-scripts.tar.gz

4

फ़ाइल की अनुमति की जानकारी प्राप्त करने के लिए आप ls का उपयोग नहीं करते हैं। आप स्टेटमेंट कमांड का उपयोग करें। यह आपको संख्यात्मक मान देगा जो आप चाहते हैं। "यूनिक्स वे" कहता है कि आपको अपनी खुद की स्क्रिप्ट का उपयोग करना चाहिए ls (या 'इको *') और स्टेट और जो कुछ भी आप चाहते हैं प्रारूप में जानकारी देना पसंद करते हैं।


1

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

# ls, with chmod-like permissions and more.
# @param $1 The directory to ls
function lls {
  LLS_PATH=$1

  ls -AHl $LLS_PATH | 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}"
}

कुछ यूनिक्स के लिए काम नहीं करता है: ls: ERROR: Illegal option -- Husage: ls -1ACFLRTabcdfgilmnopqrstux -W[sv] [files]awk: cmd. line:2: fatal: file '/usr/include' is a directory
kbulgrien

0

प्रश्न को ध्यान में रखते हुए UNIX निर्दिष्ट करता है, न कि लिनक्स, statबाइनरी का उपयोग आवश्यक नहीं है। नीचे दिए गए समाधान बहुत पुराने UNIX पर काम करते हैं, हालांकि sh(यानी bash) के अलावा एक शेल आवश्यक था। यह ग्लेन जैकमैन के perl stat समाधान की व्युत्पत्ति है । यह एक विकल्प की तरह लगता है जो संक्षिप्तता के लिए खोज करने योग्य है।

$ alias lls='llsfn () { while test $# -gt 0; do perl -s -e \
  '\''@fields = stat "$f"; printf "%04o\t", $fields[2] & 07777'\'' \
    -- -f=$1; ls -ld $1; shift; done; unset -f llsf; }; llsfn'
$ lls /tmp /etc/resolv.conf
1777    drwxrwxrwt   7 sys      sys       246272 Nov  5 15:10 /tmp
0644    -rw-r--r--   1 bin      bin           74 Sep 20 23:48 /etc/resolv.conf

इस उत्तर में जानकारी का उपयोग करके उपनाम विकसित किया गया था

संपूर्ण उत्तर इस उत्तर में समाधान का एक संशोधित संस्करण है

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