Возврат самого верхнего принадлежащего каталога пользователем, если ничто не принадлежит другому пользователю в этом каталоге

sed -e '1{x;s/^/XXXXXXXXXXXXXXX/;x;}
   26115bp
   32198bp
   37256bp
   40001bp
   40023bp
   d
   :p
   g
' data_file

Сначала мы заполним пространство хранения желаемым шаблоном XXXXXXXXX, а затем вызовем его только для нужных номеров строк, перейдя к метке :p, которая извлечет пространство хранения, которое затем будет неявно перенесено в стандартный вывод. Несоответствующие -строки удаляются (, измените dна b, если вы хотите их сохранить ).

1
03.08.2019, 05:25
1 ответ

Используйте этот скрипт:

#!/bin/sh -

u="$1"
shift

find "$@" -type d -user "$u" ! -exec sh -c '
   find "$2" -type d ! -user "$1" | grep -qm 1.
' find-sh "$u" {} \; -prune -print

Пример использования:

/path/to/the_script userA./

Первый аргумент (здесьuserA)— это имя пользователя. Все, что следует за (здесь ./), будет передано в find;вы должны передать начальный путь (s )таким образом (хотя внедрение тестов технически возможно ).

Сценарий использует main findдля поиска каталогов, принадлежащих пользователю. Для такого каталога вызывается другой find, он находит подкаталоги, не принадлежащие пользователю. Если его нет, каталог обрезается (, так что основной findне будет проверять свои подкаталоги )и печатается его путь.

Примечания:

  • Если внутренний findчто-нибудь найдет, то внешний (основной)findне будет обрезать каталог, он проверит его подкаталоги. Если то, что нашел внутренний find, находится глубоко внизу, то многие подкаталоги на разных уровнях будут проверены много раз «напрасно», прежде чем скрипт перейдет к другой ветви дерева каталогов. Если дерево каталогов не очень большое, ОС должна кэшировать метаданные, и следующая findпроверка того же подкаталога должна быть быстрой. Многократная проверка кажется неоптимальной, но любая попытка оптимизировать это усложнит код; имхо оно того не стоит.
  • grep -m 1закрывается после первого совпадения, но эта опция не переносима. Если ваш grepне поддерживает -m, просто не используйте его (, т.е. используйтеgrep -q.). Скрипт будет медленнее, но работать будет.
  • find-shобъясняется здесь:Что такое второй sh в sh -c 'some shell code' sh?
  • В заголовке сказано «если ничто не принадлежит другому пользователю», но ваш пример и вариант использования предполагают «если ни один подкаталог не принадлежит другому пользователю». Мой скрипт проверяет только каталоги (sub ). Для проверки «если ничего…» опустите проверку -type dпри вызове внутреннего find.
  • Ошибки
  • Permission deniedмогут привести к ложным срабатываниям.
0
07.06.2021, 20:34

Теги

Похожие вопросы