Чи може команда списку Unix 'ls' виводити числові дозволи chmod?


Відповіді:


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}'"
небезпека89

6
Я скопіював і вставив рядок з небезпеки89 і виявив, що дивним чином вихід починається з% 0..o на рядок, замість того, щоб сказати 755. Якщо хтось інший стикається з цим, причина виглядає як прихований символ між 0 і o. Після видалення команда налаштована непогано. Ура!
Донна

Я думаю, що існує питання розрахунку. Після того, як chmod 777 dirваша команда друкує дозволи як767
Джуліан Ф. Вайнерт

Як згадує Донна, між 0 і о є смішний персонаж (або 2), також дивно це виглядає, як ТАК додає його ...
nbsp

3
Це не в змозі розпізнати біти t і s. Слід скористатися командою 'stat' для отримання інформації про дозвіл файлу. Розрахунок його вручну призведе до помилок!
Еван Ланглуа

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% працює в будь-якій системі
Кенгуру

Якщо ви хочете використовувати stat, щоб бачити права рекурсивно, під bash, використовуйте stat -c '%a %n' * **/*.
Денис Шевальє

61

ви можете просто використовувати GNU find.

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

Це команда, яку я можу насправді запам'ятати. Корисні та ефективні.
Трент

5
Це також повинно мати -maxdepth 1опцію, інакше воно перетинає все дерево каталогів.
Руслан

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, який навіть не з’являється у статистиці на Mac?
igonejack

1
Це насправді команда FreeBSD, і Mac, як буває, будується на цьому, використовуючи її як верхнє ядро.
Мохд Абдул Муджіб

Якщо ми використовуємо лише інформацію, представлену в man statmacOS 10.14.4, тоді команда повинна бути stat -f "%Lp %N" *. %LpЗдається, друкує те саме, що і %A.
Сезар Андреу

17

@TY MYYN

вау, приємний awk! А як щодо суїда, жорсткого та клейкого шматочка?

Ви повинні розширити свій фільтр на s і t, інакше вони не будуть зараховані, і ви отримаєте неправильний результат. Для обчислення восьмеричного числа для цього спеціального прапора процедура є такою ж, але індекс дорівнює 4 7 та 10. можливі прапори для файлів із набором бітів Execute ---s--s--tamd для файлів без біта виконання Execution are---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/…
Йордан Георгієв

5
Не використовуйте lsmod як псевдонім .. це відома команда posix для перелічення модів ядра.
shadowbq

@JeroenWiertPluimers Це дає мені синтаксичну помилку від awk
Еван Ланглуа

@EvanLanglois, тому задайте нове запитання.
Jeroen Wiert Pluimers

9

Використовуйте це, щоб відобразити числові значення дозволу Unix (восьмеричні значення) та ім'я файлу.

stat -c '%a %n' *

Використовуйте це, щоб відобразити числові значення дозволу Unix (вісімкові значення) та жорсткий і липкий біт папки, ім'я власника власника, ім'я групи, загальний розмір у байтах та ім'я файлу.

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

введіть тут опис зображення

Додайте, %yякщо вам потрібен час останньої модифікації у читаному для людини форматі. Для отримання додаткових варіантів див. Stat .

Краща версія з використанням псевдоніма

Використання псевдоніма - це більш ефективний спосіб досягти того, що вам потрібно, а також включає колір. Далі відображаються ваші результати, організовані спочатку за груповими каталогами, відображаються у кольорі, розмірами друку у читаному для людини форматі (наприклад, 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" говорить про те, що ви повинні вигадати свій власний сценарій, використовуючи ls (або "echo *") та stat та все, що вам більше подобається, щоб надати інформацію у бажаному форматі.


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}"
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.