Construa uma matriz que você usa posteriormente em sua chamada para find
. O script a seguir lê os padrões de caminho delimitados por nova linha de sua entrada padrão e chama find
:
#!/bin/sh
set --
while IFS= read -r path; do
set -- "$@" -o -path "$path"
done
shift # remove initial "-o" from $@
find . -type d ! '(' "$@" ')'
Você executaria isso com
./script.sh <paths.txt
onde paths.txt
pode parecer
*/.git
*/.git/*
*/.vscode
*/.vscode/*
*/node_modules
*/node_modules/*
*/Image
*/Image/*
*/Rendered
*/Rendered/*
*/iNotebook
*/iNotebook/*
*/GeneratedTest
*/GeneratedTest/*
*/GeneratedOutput
*/GeneratedOutput/*
*/*_files
Ou, desde que seus padrões de caminho sejam basicamente nomes de diretórios:
#!/bin/sh
set --
while IFS= read -r dirname; do
set -- "$@" -o '(' -name "$dirname" -prune ')'
done
shift # remove initial "-o" from $@
find . -type d ! '(' "$@" ')'
com o arquivo padrão contendo
.git
.vscode
node_modules
Image
Rendered
iNotebook
GeneratedTest
GeneratedOutput
*_files
Essa variante do código impediria que find
caísse nos diretórios correspondentes aos padrões no arquivo, enquanto o primeiro script (assim como seu código) testaria os padrões -path
em relação a todos os diretórios excluídos independentemente do fato de você não estar interessado em nada abaixo desses caminhos.