Aquí hay una solución simple, que funcionará si eres root.
su $uid -c kill SIGSTOP -1
Explicación :Conviértete en ese usuario y mata todo lo que puedas.
Todas las soluciones requerirán el permiso CAP _KILL (para eliminar cualquier proceso ), o ser root tradicional (root tiene este permiso ), y permiso (capacidad para cambiar su propio uid ), como se usa en esta solución.
Tenga en cuenta que envié sigstop, esto detendrá el proceso (según lo solicitado ☺ ). Elige la señal que quieras. Utilice sigkill como último recurso.
Одним из способов с GNU find
или совместимым(-iname
уже является расширение GNU в любом случае )может быть определение функции как:
findn() (
if [ -t 1 ]; then # if the output goes to a terminal
action=-print # simple print for the user to see
else
action=-print0 # NUL-delimited records so the output can be post-processed
fi
first=true
for arg do
if "$first"; then
set -- "$@" '('
first=false
else
set -- "$@" -o
fi
set -- "$@" -iname "*$arg*"
shift
done
"$first" || set -- "$@" ')'
exec find. "$@" "$action"
)
Затем вы можете использовать его как:
findn foo bar
Для см. имена файлов, которые содержат foo
или bar
(, измените -o
на -a
выше, если вы хотите, чтобы они содержали как foo
, так иbar
).
И:
findn foo bar | xargs -r0 cat
Если вы хотите применить команду к каждому файлу, найденному с помощью findn
.
Для варианта, который выполняет и , и , и , но не:
findn() (
if [ -t 1 ]; then # if the output goes to a terminal
action=-print # simple print for the user to see
else
action=-print0 # NUL-delimited records so the output can be post-processed
fi
first=true
for arg do
if "$first"; then
set -- "$@" '('
first=false
else
set -- "$@"
fi
if [ "$arg" = ! ]; then
set -- "$@" !
else
case $arg in
(*[][*?\\]*)
# already contains wildcard characters, don't wrap in *
set -- "$@" -iname "$arg"
;;
(*)
set -- "$@" -iname "*$arg*"
;;
esac
fi
shift
done
"$first" || set -- "$@" ')'
exec find. "$@" "$action"
)
А затем:
findn foo bar ! baz
Для имен файлов, содержащих как foo
, так и bar
, но не baz
.
В этом варианте я также сделал так, что если аргумент содержал подстановочный знак, он воспринимался как -, так что вы можете сделать:
findn foo ! 'bar*'
Для поиска файлов, которые не начинаются с бара. Если вы используете оболочку zsh
, вы можете создать псевдоним:
alias findn='noglob findn'
Чтобы отключить подстановку для этой команды, которая позволяет вам писать:
find foo ! bar*
Вы можете захотеть сделать это скриптом (здесь скрипта sh
достаточно, так как это синтаксис POSIX )вместо функции, поэтому его можно вызывать из любого места, а не только из вашей оболочки.
Ваше решение отлично работает сxargs
:
$ echo "foo bar one" > foobarone
$ echo "foo bar two" > fooBARtwo
$ findn "bar"
./fooBARtwo
./foobarone
$ findn "bar" | xargs cat
foo bar two
foo bar one
Или я что-то пропустил?
И если вы немного измените свою функцию, вы можете добавить дополнительные параметры в свою команду find
:
findn () {
local name=$1
shift
find. -iname "*$name*" "$@"
}
Пример:
$ findn bar ! -name '*two' -print0 | xargs -0 cat
foo bar one