Неважно. pbuilder-dist
делает именно то, что здесь необходимо.
С помощью bash
вы можете сделать:
all=(*)
except=(file1 file2 notme.txt)
only=()
IFS=/
for file in "${all[@]}"; do
case "/${except[*]}/" in
(*"/$file/"*) ;; # do nothing (exclude)
(*) only+=("$file") # add to the array
esac
done
ls -ld -- "${only[@]}"
(это работает здесь для файлов в текущем каталоге, но не надежно для глобусов, таких как all=(*/*) кроме =(foo/bar)
, так как мы используем /
для объединения элементов массива для поиска).
Это основано на том факте, что "${array[*]}"
объединяет элементы массива с первым символом $IFS
(здесь выбрано /
иначе он не может встречаться в файле name; NUL — это символ, который не может встречаться в файле path, но, к сожалению, bash
(в отличие от zsh
) не может иметь такого символа в своих переменных). Таким образом, для каждого файла в $all
(здесь, например, $file
является foo
), мы выполняем case "/file1/file2/ notme.txt/" в (*"/foo/"*)
, чтобы проверить, следует ли исключить $file
.
С zsh
проще:
except=(file1 file2 notme.txt)
all=(*)
only=(${all:|except})
ls -ld -- $only
Мнемоника для ${all:|кроме}
: элементы из $all
barте из $кроме
.
Вы также можете проверить, находятся ли файлы в массиве $except
как часть квалификатора glob:
ls -ld -- *.txt(^e:'((except[(Ie)$REPLY]))':)
Или с помощью функции:
in_except() ((except[(Ie)${1-$REPLY}]))
ls -ld -- *.txt(^+in_except)