Как удалить все, кроме числовых каталогов верхнего уровня?

Я по глупости забыл, что вещи, которые #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)

Итак, теперь я знаю, как предотвратить попытки замены обработчиков сигналов на зарезервированные - я подозреваю, что любая попытка будет отклонена в любом случае, но для сообщения об ошибках лучше знать, каковы пределы, а не определять им от соси и смотри подход!

4
08.08.2017, 20:48
5 ответов

Если у вас есть доступ к GNU find, вы можете запустить:

find. -maxdepth 1 -not \( -type d -regex '.*/[0-9]*$' \) -exec rm -r {} +

Идея состоит в том, чтобы найти те файлы верхнего уровня, которые не являются каталогами i )и ii ), имя которых состоит только из чисел.

Я настоятельно рекомендую вам запустить его один раз с echoвместо rm -r, чтобы посмотреть, что он будет делать.

4
27.01.2020, 20:45

С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 для включения скрытых файлов(Dot файлов)
  • (^-/)квалификатор glob, чтобы сказать только файлы, которые не относятся к типу каталога после разрешения символической ссылки(удалите -, если вы также хотите удалить символические ссылки на каталоги ).
5
27.01.2020, 20:45
cd /path/to/foo && \
find. -maxdepth 1 ! -type d -delete -o \
   ! -name. -name '*[!0-9]*' -exec rm -rf {} +

Что читается как:

  • перейти в каталог /path/to/foo и успешно там
  • вызовите find, чтобы перейти только на один уровень вглубь и удалить там все каталоги, отличные от -.
  • для всех остальных, т. е. подкаталогов в вашем каталоге /path/to/foo, отклоните те, которые имеют имена «.», а что осталось из них, выберите те, в которых есть хотя бы одна нецифра.
  • Отобранные диры затем направляются на скотобойню, тем самым гарантируя выживание только цифр -диров.
4
27.01.2020, 20:45
find./* ! \( -type d -regex "./[0-9]+\(/.*\)?" \) -delete

или, если fooслишком много файлов и происходит превышение лимита аргументов, используйте:

find. ! -path. ! \( -type d -regex "./[0-9]+\(/.*\)?" \) -delete
1
27.01.2020, 20:45

Помимо 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
3
27.01.2020, 20:45

Теги

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