คำสั่ง Unix แสดงคำสั่ง 'ls' เอาต์พุตเชิงตัวเลขของสิทธิ์ chmod ได้หรือไม่?


179

เป็นไปได้หรือไม่เมื่อแสดงรายการไดเร็กทอรีเพื่อดูสิทธิ์ unix ที่เป็นตัวเลขเช่น 644 แทนที่จะเป็นสัญลักษณ์เอาต์พุต -rw-rw-r--

ขอบคุณ

คำตอบ:


339

มันเกือบจะ ..

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

31
สำหรับการสร้างมันเป็นนามแฝง (ตัวอย่างด้านล่าง: คำสั่ง '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}'"
danger89

6
ฉันคัดลอกและวางสายจากอันตราย 89 และพบว่าผลลัพธ์ที่แปลกเริ่มต้นด้วย% 0..o ต่อบรรทัดแทนที่จะพูด 755 ถ้าใครมาเจอเรื่องนี้สาเหตุดูเหมือนจะเป็นตัวละครที่ซ่อนอยู่ระหว่าง 0 และ o เมื่อลบคำสั่งจะถูกตั้งค่าอย่างดี ไชโย!
เอก

ฉันคิดว่ามีปัญหาในการคำนวณ หลังจากchmod 777 dirคำสั่งของคุณพิมพ์การอนุญาตเป็น767
Julian F. Weinert

ในฐานะที่เป็นเอกกล่าวมีเป็นตัวตลก (หรือ 2) ระหว่าง 0 และ o ยังวิจิตรพิสดารดูเหมือนว่าดังนั้นจะเพิ่มมัน ...
nbsp

3
สิ่งนี้ล้มเหลวในการรู้จักบิต t และ s คุณควรใช้คำสั่ง 'stat' เพื่อรับข้อมูลการอนุญาตไฟล์ การคำนวณด้วยมือจะทำให้เกิดข้อผิดพลาด!
Evan Langlois

148

ที่ใกล้เคียงที่สุดฉันนึกถึง (ทำให้มันง่ายพอ) คือ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

20
วิธีนี้ใช้งานได้ดีภายใต้ Linux ฉันพบว่าstat -f '%A %N' *ทำสิ่งเดียวกันบน mac (FreeBSD)
reevesy

2
ฉันเดาว่าเหตุผลก็statคือไม่ใช่lsดังนั้นนี่ไม่ใช่คำตอบที่ถูกต้อง อย่างไรก็ตามฉันเชื่อว่านี่เป็นคำตอบที่ถูกต้องในบริบทของผลลัพธ์ที่ต้องการ หากawkได้รับอนุญาตในท่อแล้วfindควรได้รับอนุญาตที่statถูกเรียกใน-exec; จากนั้นคุณสามารถใช้statโดยตรงโดยไม่ต้อง*
javafueled

2
นี่จะสั้นกว่าและดีกว่ามาก 100% ทำงานบนระบบใดก็ได้
Kangarooo

stat -c '%a %n' * **/*หากคุณต้องการที่จะใช้สถิติเพื่อดูสิทธิซ้ำภายใต้การทุบตีการใช้งาน
Denis Chevalier

61

คุณสามารถใช้ GNU find

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

นี่เป็นคำสั่งที่ฉันจำได้จริงๆ เป็นประโยชน์และมีประสิทธิภาพ
เทรนต์

5
สิ่งนี้ควรมี-maxdepth 1ตัวเลือกไม่เช่นนั้นมันจะสำรวจทรีไดเรกทอรีทั้งหมด
Ruslan

36

คุณสามารถใช้คำสั่งต่อไปนี้

stat -c "%a %n" *

นอกจากนี้คุณสามารถใช้อย่างใดอย่างหนึ่งfilenameหรือdirectorynameแทน*เพื่อรับผลลัพธ์เฉพาะ

บน Mac คุณสามารถใช้

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

1
! ที่เป็นประโยชน์ คุณขุดมันออกมาได้อย่างไร% A ที่ไม่ได้แสดงใน man of stat บน Mac?
igonejack

1
อันที่จริงมันเป็นคำสั่ง FreeBSD และ Mac ก็เกิดขึ้นเพื่อสร้างขึ้นโดยใช้มันเป็นเคอร์เนลบน
Mohd Abdul Mujib

ถ้าเราจะใช้ข้อมูลที่นำเสนอในman statบน MacOS 10.14.4 stat -f "%Lp %N" *แล้วคำสั่งที่ควรจะเป็น ดูเหมือนจะพิมพ์เป็นสิ่งเดียวกับ%Lp %A
Cesar Andreu

17

@ MYYN

ว้าวววววว! แต่สิ่งที่เกี่ยวกับ suid, sgid และบิตเหนียว?

คุณต้องขยายตัวกรองของคุณด้วย s และ t มิฉะนั้นตัวกรองจะไม่นับและคุณได้ผลลัพธ์ที่ผิด ในการคำนวณหมายเลขฐานแปดสำหรับแฟล็กพิเศษนี้ขั้นตอนจะเหมือนกัน แต่ดัชนีอยู่ที่ 4 7 และ 10 แฟล็กที่เป็นไปได้สำหรับไฟล์ที่มีชุดบิตรันคือ---s--s--tamd สำหรับไฟล์ที่ไม่มีชุดบิตรัน---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;}'"
Jeroen Wiert Pluimers

+1 นำแนวคิดเพิ่มเติมเพื่อคืนค่าสิทธิ์การทำงานของไฟล์: ysgitdiary.blogspot.fi/2013/04/ …
Yordan Georgiev

5
อย่าใช้ lsmod เป็นนามแฝง .. นั่นเป็นคำสั่ง posix ที่รู้จักกันสำหรับการแสดงรายการเคอร์เนล mods
shadowbq

@JeroenWiertPluimers นั่นทำให้ฉันมีข้อผิดพลาดทางไวยากรณ์จาก awk
Evan Langlois

@EvanLanglois ดังนั้นถามคำถามใหม่
Jeroen Wiert Pluimers

9

ใช้สิ่งนี้เพื่อแสดงค่าการอนุญาตเชิงตัวเลขของ Unix (ค่าฐานแปด) และชื่อไฟล์

stat -c '%a %n' *

ใช้สิ่งนี้เพื่อแสดงค่าการอนุญาตของ Unix (ค่าฐานแปด) และบิต 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 เพื่อรับข้อมูลการอนุญาตของไฟล์ คุณใช้คำสั่ง stat มันจะให้ค่าตัวเลขที่คุณต้องการ "Unix Way" กล่าวว่าคุณควรประดิษฐ์สคริปต์ของคุณเองโดยใช้ ls (หรือ 'echo *') และสถิติและสิ่งอื่นที่คุณต้องการให้ข้อมูลในรูปแบบที่คุณต้องการ


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}"
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.