В оболочке zsh
**//**
расширится на все имена в /
, а также на все имена в текущем каталоге (рекурсивно).
Из пустого каталога в моей системе:
$ echo **//**
/altroot /bin /boot /bsd /bsd.booted /bsd.rd /bsd.sp /dev /etc /extra /home /mnt /root /sbin /sys /tmp /tmp_mnt /usr /var /vol
Почему? Ну, **/
рекурсивно сопоставляет все каталоги в текущем каталоге. Что еще более важно, он соответствует каталогу current , но поскольку имя текущего каталога недоступно в текущем каталоге, для него нет возвращаемой записи.
Однако , когда вы добавляете /
к этому для создания **//
, вы получаете одинокий /
для текущего каталога. Снова в пустом каталоге:
$ echo **//
/
Затем, если вы добавите еще **
для создания **//**
, вы заберете все имена из каталога root вместе со всеми именами из текущего каталог и ниже (имена каталогов из текущего каталога и ниже будут встречаться в списке дважды).
Ваш xargs
вызывает
rm **//** rm -r $(ls . | grep -P '...')
Если вы используете GNU rm
, он будет тщательно переставлять командную строку так, чтобы она интерпретировалась так же, как
rm -r **//** rm $(ls . | grep -P '...')
Теперь это должно быть понятно.
Если вы хотите удалить все обычные файлы в текущем каталоге с суффиксами имен файлов .zip
, .tar
или .7z
используйте
rm ./*.(zip|tar|7z)(.)
в оболочке zsh
. Если вы хотите сделать это рекурсивно вниз в подкаталоги, используйте
rm ./**/*.(zip|tar|7z)(.)
Спецификатор glob (.)
заставляет шаблон глобирования соответствовать только обычным файлам. Вы можете даже ограничить его файлами более определенного размера, скажем, 10 МБ, с ./**/*.(zip|tar|7z)(.Lm+10)
.