sed -e '1{x;s/^/XXXXXXXXXXXXXXX/;x;}
26115bp
32198bp
37256bp
40001bp
40023bp
d
:p
g
' data_file
Сначала мы заполним пространство хранения желаемым шаблоном XXXXXXXXX
, а затем вызовем его только для нужных номеров строк, перейдя к метке :p, которая извлечет пространство хранения, которое затем будет неявно перенесено в стандартный вывод. Несоответствующие -строки удаляются (, измените d
на b
, если вы хотите их сохранить ).
Используйте этот скрипт:
#!/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
?-type d
при вызове внутреннего find
. Permission denied
могут привести к ложным срабатываниям.