Может ли команда списка Unix выводить числовые разрешения chmod?

Возможно ли при перечислении каталога для просмотра числовых разрешений unix, таких как 644, а не символьного вывода -rw-rw-r -

Спасибо.

Ответ 1

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

stat -c '%a %n' *

enter image description here

Для получения дополнительной информации см. Стат.

Для более эффективного способа сделать это с помощью псевдонима, см. Мой комментарий ниже.

Ответ 2

Ближе всего я могу думать (достаточно просто), 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

Ответ 3

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

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

Ответ 4

Вы можете использовать следующую команду

stat -c "%a %n" *

Также вы можете использовать любые filename или directoryname вместо *, чтобы получить конкретный результат.

На Mac вы можете использовать

stat -f '%A %N' *

Ответ 5

@MYYN

Ничего себе, хороший awk! Но как насчет suid, sgid и липкого бита?

Вы должны расширить свой фильтр с помощью s и t, иначе они не будут учитываться, и вы получите неправильный результат. Чтобы вычислить восьмеричное число для этих специальных флагов, процедура такая же, но индекс равен 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

Ответ 6

Вы не используете ls для получения информации о разрешении файла. Вы используете команду stat. Он даст вам численные значения, которые вы хотите. В "Unix Way" говорится, что вы должны придумать свой собственный script с помощью ls (или 'echo *') и stat и все, что вам нравится, предоставить информацию в желаемом формате.

Ответ 7

нет, он может печатать только числовые uids/guids.

Ответ 8

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

stat -c '%a %n' *

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

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

enter image description here

Добавьте %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;}'"

Alias is the most efficient solution

Дерево папок

Пока вы редактируете ваш 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

Ответ 9

Создав выбранный ответ и чтобы использовать псевдоним, я преобразовал его в так что возможна передача каталога в список.

# 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}"
}

Ответ 10

tl; dr: быстрый ответ на вопрос: никто не может распечатать числовые разрешения, используйте stat.

Расширенные права будут потеряны в переводе, если возиться с awk.

например:

$ ls -la /usr/local/src/
total 8
drwxrwsr-x  2 root staff 4096 Oct 23 11:18 .
drwxrwsr-x 10 root staff 4096 Oct 23 11:18 ..

Предлагаемое решение напечатало бы это:

$ ls -la /usr/local/src | awk '{>
total 8
765 drwxrwsr-x  2 root staff 4096 Oct 23 11:18 .
765 drwxrwsr-x 10 root staff 4096 Oct 23 11:18 ..

Что совершенно не так.

stat, с другой стороны, делает это правильно:

$ stat/usr/local/src Файл: /usr/local/src Размер: 4096 Блоки: 8 Блок ввода-вывода: каталог 4096 Устройство: 801h/2049d Индекс: 917803 Ссылки: 2 Доступ: (2775/drwxrwsr-x) Uid: ( 0/root) Gid: (50/персонал) Доступ: 2018-10-24 12: 30: 58.197907324 +0900 Изменение: 2018-10-23 11:18: 59.810677000 +0900 Изменение: 2018-10-23 11:18: 59,810677000 +0900 Рождение: -

Бонус от мужской стат:

$ stat -c %a /usr/local/src
2775

Это было проверено на стабильной Debian.