Я бы сделал это в bash
, используя globstar
. Как объясняется в man bash
:
globstar
If set, the pattern ** used in a pathname expansion con‐
text will match all files and zero or more directories
and subdirectories. If the pattern is followed by a /,
only directories and subdirectories match.
Итак, чтобы переместить каталог run
в каталог верхнего уровня x
, а затем удалить остальные, вы можете сделать :
shopt -s globstar; mv x/**/run/ x/ && find x/ -type d -empty -delete
Команда shopt
включает параметр globstar
. mv x / ** / run / x /
переместит все подкаталоги с именем run
(обратите внимание, что это работает, только если есть только один каталог run
) в x
и find
удалит все пустые каталоги.
Если хотите, вы можете сделать все это в оболочке с расширенной глобализацией, но я предпочитаю подстраховку find -empty
, чтобы быть уверенным, что непустые каталоги не будут удалены. Если вас это не волнует, вы можете использовать:
shopt -s globstar; shopt -s extglob; mv x/**/run/ x/ && rm -rf x/!(run)
Вы можете составить разумный краткий список, используя:
ps -ef | awk '$1 == "myUser" && $3 == 1'
Возможно, улучшите это, отфильтровав и другие поля, например, STIME не для запуска сеанса, TTY не ?, и CMD не начинается с /usr/lib или /usr/bin или /lib. Поместите список в файл для окончательной проверки, а затем выведите столбец 2 | xargs | убийство.