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.