Может ли команда Unix list '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
Я скопировал и вставил строку из danger89 и обнаружил, что странным образом вывод начался с% 0..o в строке, а не, скажем, с 755. Если кто-то еще сталкивался с этим, причиной, по-видимому, является скрытый символ между 0 и o. После удаления команда настроена красиво. Ура!
Донна
Я думаю, что есть проблема расчета. После того, как chmod 777 dirваша команда напечатает разрешения как767
Джулиан Ф. Вейнерт
Как упоминает Донна, между 0 и o есть забавный символ (или 2), также странно выглядит, как будто SO добавляет его ...
nbsp
3
Это не может распознать биты t и s. Вы должны использовать команду stat для получения информации о правах доступа к файлу. Расчет вручную приведет к ошибкам!
Эван Ланглуа
148

Самое близкое, что я могу придумать (сделать это достаточно просто) stat, это предположить, что вы знаете, какие файлы вы ищете. Если нет, *можете найти большинство из них:

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

Это обрабатывает липкий, suid и компанию из коробки:

$ stat -c '%a %n' /tmp /usr/bin/sudo
1777 /tmp
4755 /usr/bin/sudo
JB.
источник
20
Это прекрасно работает под Linux, я обнаружил, stat -f '%A %N' *делает то же самое на Mac (FreeBSD)
reevesy
2
Я предполагаю, что аргумент в том, что statэто не так, lsпоэтому это не правильный ответ. Тем не менее, я считаю, что это правильный ответ в контексте желаемого результата. Если awkразрешено в трубе, то findдолжно быть разрешено, где statвызывается -exec; тогда вы можете использовать statнапрямую без*
javafueled
2
Это намного лучше, короче и работает на 100% на любой системе
Kangarooo
Если вы хотите использовать stat для рекурсивного просмотра прав, используйте bash stat -c '%a %n' * **/*.
Денис Шевалье
61

Вы можете просто использовать GNU find.

find . -printf "%m:%f\n"
ghostdog74
источник
Это команда, которую я действительно могу вспомнить. Полезно и эффективно.
Трент
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, который даже не появляется в человеке stat на Mac?
igonejack
1
На самом деле это команда FreeBSD, и Mac просто основан на ней, используя ее как верхнее ядро.
Мохд Абдул Муджиб
Если мы используем только информацию, представленную в man statmacOS 10.14.4, то команда должна быть такой stat -f "%Lp %N" *. %Lpкажется, чтобы напечатать то же самое, что и %A.
Цезарь Андреу
17

@ MYYN

вау, классно! Но как насчет suid, sgid и sticky?

Вы должны расширить свой фильтр с помощью 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
user224243
источник
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/…
Йордан Георгиев,
5
Не используйте lsmod в качестве псевдонима. Это известная команда posix для вывода списка модов ядра.
shadowbq
@JeroenWiertPluimers Это дает мне синтаксическую ошибку от awk
Эван Ланглуа
@EvanLanglois, так что задайте новый вопрос.
Йерун Wiert Pluimers
9

Используйте это для отображения числовых значений разрешений Unix (восьмеричных значений) и имени файла.

stat -c '%a %n' *

Используйте это, чтобы отобразить числовые значения разрешений Unix (восьмеричные значения) и sgid и sticky-бит папки, имя пользователя владельца, имя группы, общий размер в байтах и ​​имя файла.

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» говорит, что вы должны изобрести свой собственный скрипт, используя 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}"
}
Кертис Блэквелл
источник