Как я могу вернуть список скрытых файлов, доступных для чтения текущему пользователю в bash, без использования флага -readable?

Я хочу запустить команду, которая выводит все скрытые файлы, которые текущий пользователь может прочитать - в Bash.

Пока что я использую find команда, с -perm но я не могу получить файлы, которые может прочитать текущий пользователь, но файлы, которые может прочитать член GROUP текущего пользователя. В целях тестирования я смотрю только в /home/ реж. Это достигается с помощью:

find /home/ ! -perm u+r -regextype egrep -regex '^(/.+)*/\..*')' 2>/dev/null

Я не хочу использовать -readable флаг, так как он не поддерживается во всех реализациях find

Есть ли какие-то магические восьмеричные разрешения, которые я могу использовать для этого?

1 ответ

Соответствующий стандарт, к которому все find Реализации должны соответствовать http://pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html.

Это сказало, -readable был добавлен как расширение к стандарту, потому что он добавляет возможности, которые стандарт find не имеет Чтобы обойтись без этого, нам нужно поставить под угрозу либо производительность, либо правильность.


Правильно, но медленно

Если вы действительно хотите быть на 100% правильными во всех случаях, рассмотрите возможность проведения теста вне find, следующее:

find /home -type f -name '.*' '(' -exec test -r '{}' \; ')' -print

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


Менее медленно (с использованием оценки Shell-Builtin)

find /home -type f -name '.*' -exec sh -c '
  for filename; do test -r "$filename" && printf "%s\n" "$filename"; done
' _ {} +

Вместо запуска одной копии test для каждого файла начинается sh на пакет файлов (размер каждого пакета зависит от количества имен файлов, которые могут поместиться в командной строке) и использует копию test встроенный в это sh экземпляр для оценки и печати этих имен.


Быстро, но несовершенно

Следующее только запускает вышеупомянутый, дорогой, тест для файлов, которые не выглядят читаемыми из-за их явных прав доступа к файлам:

find /home -type f -name '.*' \
  '(' \
    '(' \
      '(' -perm -0004 ')' -o \
      '(' -group "$(id -g)" -perm -0040 ')' -o \
      '(' -user  "$(id -u)" -perm -0400 ')' \
    ')' -o '(' -exec test -r '{}' \; ')' \
  ')' -print

То есть:

  • -perm 0004 соответствует всем файлам, которые доступны для чтения
  • -group "$(id -g)" -perm -0040 сопоставляет все файлы, которые имеют первичную группу текущего пользователя в качестве своей группы и доступны для чтения в группе.
  • -user "$(id -u)" -perm -0400 соответствует всем файлам, которые принадлежат текущему пользователю.
  • Финал -exec test -r '{}' \; фильтры для файлов, которые доступны для чтения, несмотря на то, что они не прошли ни одного из вышеуказанных тестов (например, из-за принадлежности к вторичной группе). Этот тест медленный, поэтому мы запускаем его только для файлов, которые не выглядят читаемыми другими способами.

Это может быть неточным в необычных угловых случаях, таких как файлы с ACL или другие расширенные разрешения, изменяющие их читабельность.

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