it-swarm.com.ru

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

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

Благодарю.

167
Jon Winstanley

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

stat -c '%a %n' *

 enter image description here

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

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

301
miku

Самое близкое, о чем я могу думать (сохраняя его достаточно простым), это 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
138
JB.

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

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

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

stat -c "%a %n" *

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

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

stat -f '%A %N' *
28
Mohd Abdul Mujib

@ MYYN

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

Вы должны расширить свой фильтр с помощью 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
14
user224243

Вы не используете ls для получения информации о разрешениях файла. Вы используете команду stat. Это даст вам числовые значения, которые вы хотите. «Путь Unix» говорит, что вы должны придумать свой собственный скрипт, используя ls (или «echo *») и stat, и все, что вам нравится, чтобы предоставить информацию в желаемом формате.

4
Evan Langlois

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

2
dusoft

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

stat -c '%a %n' *

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

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

 enter image description here

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

 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
1
Erick Gonzalez

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 IO Блок: каталог 4096 Устройство: 801h/2049d Индекс: 917803 Ссылки: 2 Доступ: (2775/drwxrwsr-x) Uid: (0/root) Gid: (50/staff) Доступ: 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.

0
Steve Clement

Основываясь на выбранном ответе и предложении использовать псевдоним , я преобразовал его в функцию, чтобы можно было передавать каталог в список.

# 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}"
}
0
Curtis Blackwell