Com bash , você poderia fazer:
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[@]}"
(que funciona aqui para os arquivos no diretório atual, mas não de forma confiável para globs como all=(*/*) except=(foo/bar) , pois usamos / para unir os elementos da matriz para a pesquisa).
Baseia-se no fato de que "${array[*]}" une os elementos da matriz com o primeiro caractere de $IFS (aqui escolhido como / , como não pode ocorrer em um arquivo nome ; NUL é um caracter que não pode ocorrer em um arquivo caminho , mas infelizmente bash (ao contrário de zsh ) não pode ter tal caractere em suas variáveis). Portanto, para cada arquivo em $all (aqui com $file sendo foo como exemplo), fazemos um case "/file1/file2/notme.txt/" in (*"/foo/"*) para verificar se $file deve ser excluído.