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