FWIW похоже, что вы можете сделать это изначально в zsh, используя квалификатор glob (+cmd).
Чтобы проиллюстрировать, давайте начнем с некоторых файлов
% ls
bar baz bazfoo keepfiles.txt foo kazoo
и файл белого списка
% cat keepfiles.txt
foo
kazoo
bar
Сначала прочитайте белый список в массив:
% keepfiles=( "${(f)$(< keepfiles.txt)}" )
или, возможно, лучше
% zmodload zsh/mapfile
% keepfiles=( ${(f)mapfile[./keepfiles.txt]} )
(эквивалент bash's mapfile - или его синоним readarray). Теперь мы можем проверить, существует ли в массиве ключ (имя файла) с помощью ${keepfiles[(I)filename]}, который возвращает 0, если совпадение не найдено:
% print ${keepfiles[(I)foo]}
1
% print ${keepfiles[(I)baz]}
0
%
Мы можем использовать это, чтобы создать функцию, которая возвращает true если в массиве нет совпадений для $REPLY:
% nokeep() { (( ${keepfiles[(I)$REPLY]} == 0 )); }
Наконец, мы используем эту функцию в качестве определителя в нашей команде:
% ls *(+nokeep)
baz bazfoo keepfiles.txt
или, в вашем case
% rm -- *(+nokeep)
(Вероятно, вы захотите добавить имя белого списка в белый список.)