Você está perdendo algumas aspas duplas ( sempre coloca aspas duplas em torno das substituições de variáveis $foo
e substituições de comandos $(foo)
, a menos que você saiba por que você pode seguramente deixá-las fora e precisa deixá-las fora). Mas esse não é o problema todo.
if [ ! -d $START ]
deve ser if [ ! -d "$START" ]
.
DIRS=$(find "$START" -type d)
Neste ponto, DIRS
contém o nome do diretório inicial e seus subdiretórios recursivamente, com novas linhas no meio. Então, se você tem algum nome de diretório que contenha uma nova linha, você perdeu: é impossível saber quais novas linhas vieram de um nome de diretório e quais eram separadores. Se você sabe que não há novas linhas em nomes de arquivos, você pode analisar a saída de find
, mas como você saberia?
A propósito, é ok não ter aspas duplas em torno de $(…)
aqui, porque isso é uma atribuição de variáveis, e substituições em atribuições são implicitamente protegidas. No entanto, observe que export DIRS=$(…)
não é protegido de maneira semelhante. É melhor usar aspas, a menos que você seja fluente em scripts de shell e também todas as pessoas que manterão seu script.
for d in $DIRS
Aqui é onde você perde: você quer dividir $DIRS
em palavras, então você não pode colocar aspas duplas, mas você precisa de aspas duplas porque $DIRS
tem todos os elementos concatenados juntos e os nomes dos arquivos dentro dos espaços separadores se você os deixar sem aspas.
Normalmente, quando você usa find
, deve fazê-lo chamar o comando de processamento, com a opção -exec
. A menos que você tenha controles rígidos sobre os nomes dos arquivos, não analise a saída de find
: é ambíguo.
find "$START" -type d -exec sh -c '
echo "$0 directory has $(find "$0" -maxdepth 1 -regex ".*\." -type f -printf \n | wc -l) files whose name ends with ."
' {} \;
Observe novamente no comando find
incorporado que, se você analisar a saída de find
, sua contagem será desativada se qualquer nome de arquivo contiver uma nova linha.