найти папки, принадлежащие пользователю

найти папки, принадлежащие пользователю

У меня есть несколько общих папок, и мне нужно узнать, есть ли у пользователя там несколько папок. Например:

/shared/release/
/shared/compile/
/shared/tags/
/shared/general/

Мне нужен bash-скрипт, который выведет список этих папок и сообщит, есть ли у пользователя более одной принадлежащей ему папки.

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

решение1

С использованием find:

find /shared -mindepth 1 -maxdepth 1 -type d -user <username>

Замените <username>на фактическое имя пользователя, которое вы хотите найти.

  • -maxdepth 1предотвратит рекурсивный обход, т.е. будет просматриваться только /sharedкаталог

  • -mindepth 1предотвратит вывод на экран /sharedсамого каталога, если его владельцем является <username>. Если вы не хотите такого поведения, удалите эту опцию.

  • -type dуказывает, что нас интересуют только каталоги

  • -user <username>указывает, что мы ищем <username>собственные файлы (каталоги)

решение2

Это покажет, какие пользователи имеют более одного каталога:

find /shared -type d -printf '%u\n' | sort | uniq -dc

findДля этого требуется поддержка GNU -printf. Ваш CentOS будет иметь это.

Это выведет список как пользователей с более чем одним каталогом, так и их каталогов:

find /shared -type d -printf '%u %p\0' | awk '{c[$1]++; a[$1]=a[$1](a[$1]?"\n  ":"")$0} END{for (user in c) if (c[user]>1) print c[user],a[user]}' RS="\0"

Для максимальной гибкости мы использовали вывод с разделителями NUL из find. Для работы с этим нам понадобится GNU awk или последние версии mawk, которые поддерживают ввод с разделителями NUL. Поскольку вы используете CentOS, это должно подойти.

Как это работает

  • find /shared -type d -printf '%u %p\0'

    Это указывает find искать каталоги в /sharedи выводить их владельца, %uа также имя каталога %pв виде списка, разделенного символами NUL.

  • awk '{c[$1]++; a[$1]=a[$1](a[$1]?"\n ":"")$0} END{for (user in c) if (c[user]>1) print c[user],a[user]}' RS="\0"

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

    • c[$1]++увеличивает счетчик для пользователя, указанного в первом поле ввода.

    • a[$1]=a[$1](a[$1]?"\n ":"")$0}сохраняет имя каждого найденного каталога для этого пользователя.

    • END{for (user in c) if (c[user]>1) print c[user],a[user]}распечатывает отчет.

    • RS="\0"говорит awkиспользовать ввод, разделенный NUL. Это делает процесс безопасным, даже если имена каталогов содержат новые строки или другие сложные символы.

Связанный контент