найти пользовательские папки

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

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

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

Используя bash, как я могу получить список этих папок и определить, владеет ли пользователь более чем одним?

2 Solutions collect form web for “найти пользовательские папки”

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

 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 в списке, разделенном на NULL.

  • 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. Это делает процесс безопасным, даже если имена каталогов содержат символы новой строки или другие сложные символы.

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

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

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

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

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

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

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

  • Как получить Windows на меню grub? Использование двух жестких дисков; Сначала загрузочный загрузчик Windows
  • Удаление жесткого диска вызывает панику ядра
  • файлы журналов в CentOS 7
  • Невозможно настроить квоты в RHEL6 и CentOS6- quotecheck возвращает сообщение об ошибке
  • Какова цель avahi на сервере RHEL 7?
  • как заблокировать только определенное исходящее ip-соединение с iptables
  • Что делает -jn означать?
  • Специальная установка CentOS 7: транзакция с ошибкой
  • Использование rpm / grep для проверки того, установлены ли несколько сервисов - как один вкладыш?
  • Как настроить группу (gid) процесса, который я собираюсь запустить?
  • Egrep несколько строк в файле XML
  • Linux и Unix - лучшая ОС в мире.