С zsh
(обратите внимание, что GLOBIGNORE
не зависит от bash, ни bash
, ни zsh
установлены во FreeBSD по умолчанию, но доступны оба):
(cd /target_folder || exit
all_dirs=(*(/))
to_exclude=(${(f)"$(<names.txt))"})
rm -rf -- ${all_dirs:|to_exclude})
Особые особенности zsh
:
* (/)
. (/)
- квалификатор glob , который означает выбор только файлов типа в каталоге . $ (: расширяется до содержимого (без завершающих символов новой строки) файла
(происходит из ksh
, bash
также он есть, но выполняет форк для чтения содержимого файла
там).
$ {(f) ...}
. Это флаг раскрытия параметра , который разделяет раскрытие «$ (...)»
на перевод строки. Для bash
вам нужно будет сделать что-то вроде: IFS = $ '\ n'; set -f; to_exclude = ($ ( вместо этого.
$ {A: | B}
расширяется до элементов массива $ A
, которых также нет в массиве $ B
.