У меня есть несколько общих папок, и мне нужно узнать, есть ли у пользователя там несколько папок. Например:
/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. Это делает процесс безопасным, даже если имена каталогов содержат новые строки или другие сложные символы.