Как я могу получить разрешения двоичного файла из командной строки?

С помощью stat -c "%a %n" * я получаю разрешения файлов в восьмеричном режиме (например, 755). Есть ли способ увидеть разрешения файлов в двоичном режиме (например, 111 101 101)?

2
задан 1 July 2017 в 14:17

10 ответов

Для одного файла:

stat -c "%a" filename.txt | xargs -I PERM echo "obase=2; ibase=8; PERM" | bc

И как более понятный скрипт для более одного файла:

#!/bin/bash
for file in *
do
  perm=$(stat -c "%a" "$file")
  bin=$(echo "obase=2; ibase=8; $perm" | bc)
  echo "$bin $file"
done

вывод:

110110100 baz
110110100 foo
110110101 bar

Примечания

Сначала мы перебираем все файлы и каталоги с помощью for file in *. С stat -c "%a мы собираем разрешение файла в восьмеричном, затем, используя echo, добавляем другие необходимые данные в permission и пишем его в bc. Наконец, bc выполняет преобразование, а затем распечатывает результат и имя файла. obase = 2; означает, что вывод должен быть в двоичном формате, ibase = 8 означает, что наш вход находится в восьмеричном состоянии, а $ perm - это разрешение файла в восьмеричном формате, таком как 664.
6
ответ дан 22 May 2018 в 20:58
  • 1
    потрясающий, спасибо человек – sourav 1 July 2017 в 14:05
  • 2
    Пожалуйста, я сделал некоторые обновления, убедитесь, что вы ничего не пропустили;) – Ravexina 1 July 2017 в 14:07

Для одного файла:

stat -c "%a" filename.txt | xargs -I PERM echo "obase=2; ibase=8; PERM" | bc

И как более понятный скрипт для более одного файла:

#!/bin/bash for file in * do perm=$(stat -c "%a" "$file") bin=$(echo "obase=2; ibase=8; $perm" | bc) echo "$bin $file" done

вывод:

110110100 baz 110110100 foo 110110101 bar

Примечания

Сначала мы перебираем все файлы и каталоги с помощью for file in *. С stat -c "%a мы собираем разрешение файла в восьмеричном, затем, используя echo, добавляем другие необходимые данные в permission и пишем его в bc. Наконец, bc выполняет преобразование, а затем распечатывает результат и имя файла. obase = 2; означает, что вывод должен быть в двоичном формате, ibase = 8 означает, что наш вход находится в восьмеричном состоянии, а $ perm - это разрешение файла в восьмеричном формате, таком как 664.
6
ответ дан 18 July 2018 в 10:50

Для одного файла:

stat -c "%a" filename.txt | xargs -I PERM echo "obase=2; ibase=8; PERM" | bc

И как более понятный скрипт для более одного файла:

#!/bin/bash for file in * do perm=$(stat -c "%a" "$file") bin=$(echo "obase=2; ibase=8; $perm" | bc) echo "$bin $file" done

вывод:

110110100 baz 110110100 foo 110110101 bar

Примечания

Сначала мы перебираем все файлы и каталоги с помощью for file in *. С stat -c "%a мы собираем разрешение файла в восьмеричном, затем, используя echo, добавляем другие необходимые данные в permission и пишем его в bc. Наконец, bc выполняет преобразование, а затем распечатывает результат и имя файла. obase = 2; означает, что вывод должен быть в двоичном формате, ibase = 8 означает, что наш вход находится в восьмеричном состоянии, а $ perm - это разрешение файла в восьмеричном формате, таком как 664.
6
ответ дан 24 July 2018 в 19:39

Вы можете сделать это, используя модуль статистики perl, например. заданный

$ stat -c '%a %n' *
600 other file
775 somedir
664 somefile

, тогда

$ perl -MFile::stat -e 'printf "%b %s\n", (stat $_)->[2] & 07777, $_ for @ARGV' *
110000000 other file
111111101 somedir
110110100 somefile
1
ответ дан 22 May 2018 в 20:58

Если вы просто хотите визуализировать разрешения файлов в двоичном формате, вы можете использовать первый столбец из ls -l:

$ ls -ld /bin
drwxr-xr-x 2 root root 4096 mai 18 05:38 /bin

Здесь вы можете видеть, что rwxr-xr-x соответствует 111101101

0
ответ дан 22 May 2018 в 20:58

Python

$ python -c 'import sys,os;[ sys.stdout.write( " ".join([bin(os.stat( i ).st_mode)[-9:],i,"\n"]) ) for i in sys.argv[1:] ]' /etc/passwd
110100100 /etc/passwd 

Задача выполняется с помощью функции os.stat(), которая возвращает кортеж атрибутов файла, среди которых st_mode в десятичном формате. Затем мы преобразуем его в двоичный код и извлекаем последние 9 цифр.

Все выполняется в соответствии со списком, чтобы работать со всеми файлами, указанными в командной строке (так что вы можете предоставить несколько файлов или использовать globstar).

Как скрипт

#!/usr/bin/env python2

import sys, os

for filename in sys.argv[1:]:
    perms = os.stat(filename).st_mode
    print bin(perms)[-9:], filename
0
ответ дан 22 May 2018 в 20:58
  • 1
    Почему вы используете sys.stdout.write(' '.join([..., '\n'])) вместо просто print(...)? – wjandrea 1 July 2017 в 21:59
  • 2
    О, подождите, я думаю о Python3 – wjandrea 1 July 2017 в 22:00
  • 3
    @wjandrea print не работает в понимании списка, по крайней мере, не в Python 2. – Sergiy Kolodyazhnyy 1 July 2017 в 22:04
  • 4
    Я думаю, что читать было бы намного проще, чем скрипт. Могу ли я добавить к вашему ответу? – wjandrea 1 July 2017 в 22:32
  • 5
    @wjandrea Конечно, не стесняйтесь. Я рассматривал возможность добавления этого сценария. – Sergiy Kolodyazhnyy 1 July 2017 в 22:54

Вы можете сделать это, используя модуль статистики perl, например. заданный

$ stat -c '%a %n' * 600 other file 775 somedir 664 somefile

, тогда

$ perl -MFile::stat -e 'printf "%b %s\n", (stat $_)->[2] & 07777, $_ for @ARGV' * 110000000 other file 111111101 somedir 110110100 somefile
1
ответ дан 18 July 2018 в 10:50

Python

$ python -c 'import sys,os;[ sys.stdout.write( " ".join([bin(os.stat( i ).st_mode)[-9:],i,"\n"]) ) for i in sys.argv[1:] ]' /etc/passwd 110100100 /etc/passwd

Задача выполняется с помощью функции os.stat(), которая возвращает кортеж атрибутов файла, среди которых st_mode в десятичном формате. Затем мы преобразуем его в двоичный код и извлекаем последние 9 цифр.

Все выполняется в соответствии со списком, чтобы работать со всеми файлами, указанными в командной строке (так что вы можете предоставить несколько файлов или использовать globstar).

Как скрипт

#!/usr/bin/env python2 import sys, os for filename in sys.argv[1:]: perms = os.stat(filename).st_mode print bin(perms)[-9:], filename
0
ответ дан 18 July 2018 в 10:50

Вы можете сделать это, используя модуль статистики perl, например. заданный

$ stat -c '%a %n' * 600 other file 775 somedir 664 somefile

, тогда

$ perl -MFile::stat -e 'printf "%b %s\n", (stat $_)->[2] & 07777, $_ for @ARGV' * 110000000 other file 111111101 somedir 110110100 somefile
1
ответ дан 24 July 2018 в 19:39

Python

$ python -c 'import sys,os;[ sys.stdout.write( " ".join([bin(os.stat( i ).st_mode)[-9:],i,"\n"]) ) for i in sys.argv[1:] ]' /etc/passwd 110100100 /etc/passwd

Задача выполняется с помощью функции os.stat(), которая возвращает кортеж атрибутов файла, среди которых st_mode в десятичном формате. Затем мы преобразуем его в двоичный код и извлекаем последние 9 цифр.

Все выполняется в соответствии со списком, чтобы работать со всеми файлами, указанными в командной строке (так что вы можете предоставить несколько файлов или использовать globstar).

Как скрипт

#!/usr/bin/env python2 import sys, os for filename in sys.argv[1:]: perms = os.stat(filename).st_mode print bin(perms)[-9:], filename
0
ответ дан 24 July 2018 в 19:39
  • 1
    Почему вы используете sys.stdout.write(' '.join([..., '\n'])) вместо просто print(...)? – wjandrea 1 July 2017 в 21:59
  • 2
    О, подождите, я думаю о Python3 – wjandrea 1 July 2017 в 22:00
  • 3
    @wjandrea print не работает в понимании списка, по крайней мере, не в Python 2. – Sergiy Kolodyazhnyy 1 July 2017 в 22:04
  • 4
    Я думаю, что читать было бы намного проще, чем скрипт. Могу ли я добавить к вашему ответу? – wjandrea 1 July 2017 в 22:32
  • 5
    @wjandrea Конечно, не стесняйтесь. Я рассматривал возможность добавления этого сценария. – Sergiy Kolodyazhnyy 1 July 2017 в 22:54

Другие вопросы по тегам:

Похожие вопросы: