Я по глупости забыл, что вещи, которые #define
d не являются постоянными, если они не написаны таким образом!
Как указывает @RuiFRibeiro в / usr / include /
, специфичном для архитектуры /bits/signum.h
файл include внизу - это пара МАКРОСОВ, которые обеспечивают то, что необходимо:
#define SIGUNUSED 31
#define _NSIG 65 /* Biggest signal number + 1
(including real-time signals). */
#define SIGRTMIN (__libc_current_sigrtmin ())
#define SIGRTMAX (__libc_current_sigrtmax ())
/* These are the hard limits of the kernel. These values should not be
used directly at user level. */
#define __SIGRTMIN 32
#define __SIGRTMAX (_NSIG - 1)
Итак, теперь я знаю, как предотвратить попытки замены обработчиков сигналов на зарезервированные - я подозреваю, что любая попытка будет отклонена в любом случае, но для сообщения об ошибках лучше знать, каковы пределы, а не определять им от соси и смотри подход!
Если у вас есть доступ к GNU find
, вы можете запустить:
find. -maxdepth 1 -not \( -type d -regex '.*/[0-9]*$' \) -exec rm -r {} +
Идея состоит в том, чтобы найти те файлы верхнего уровня, которые не являются каталогами i )и ii ), имя которых состоит только из чисел.
Я настоятельно рекомендую вам запустить его один раз с echo
вместо rm -r
, чтобы посмотреть, что он будет делать.
Сzsh
:
set -o extendedglob # best in ~/.zshrc
rm -rf /path/to/foo/^<->(D) /path/to/foo/<->(^-/)
^something
это не что-то(похожее на ksh
!(something)
)<->
— это <x-y>
для соответствия десятичным целым числам от x
до y
, но ни одна из предоставленных границ (не соответствует любой последовательности десятичных цифр, подобно ksh
+([0-9])
). (D)
квалификатор glob для включения скрытых файлов(D
ot файлов)(^-/)
квалификатор glob, чтобы сказать только файлы, которые не относятся к типу каталога после разрешения символической ссылки(удалите -
, если вы также хотите удалить символические ссылки на каталоги ). cd /path/to/foo && \
find. -maxdepth 1 ! -type d -delete -o \
! -name. -name '*[!0-9]*' -exec rm -rf {} +
Что читается как:
find
, чтобы перейти только на один уровень вглубь и удалить там все каталоги, отличные от -. find./* ! \( -type d -regex "./[0-9]+\(/.*\)?" \) -delete
или, если foo
слишком много файлов и происходит превышение лимита аргументов, используйте:
find. ! -path. ! \( -type d -regex "./[0-9]+\(/.*\)?" \) -delete
Помимо zsh , вы не можете выбирать не -каталоги с помощью подстановочных знаков (вы можете только применить шаблон подстановочных знаков ко всем типам файлов или применить к каталогам и символическим ссылкам на каталоги, поместив /
в конце ).
В любой оболочке вы можете просмотреть файлы и исключить те, которые хотите сохранить. Чтобы перечислить все файлы, включая точечные файлы и .
и ..
, используйте два шаблона подстановочных знаков *.*
. Возможно, что *
не будет соответствовать ни одному файлу и останется нераскрытым; в этом случае rm -rf
выполняется для *
, что ничего не делает, поскольку rm -f
игнорирует несуществующие -аргументы.
for x in *.*; do
case "$x" in
.|..: continue;; # skip the. and.. entries
*[!0-9]*) rm -rf -- "$x";; # not just digits -> delete
*) if ! [ -d "$x" ]; then rm -f -- "$x"; fi # just digits -> delete if not a directory
esac
done