Eu tenho um script de shell bash que percorre todos os diretórios filho (mas não arquivos) de um determinado diretório. O problema é que alguns dos nomes de diretório contêm espaços.
Aqui está o conteúdo do meu diretório de teste:
$ls -F test
Baltimore/ Cherry Hill/ Edison/ New York City/ Philadelphia/ cities.txt
E o código que percorre os diretórios:
for f in `find test/* -type d`; do
echo $f
done
Aqui está a saída:
teste / Baltimore teste / cereja Colina teste / Edison teste / novo Iorque Cidade test / Filadélfia
Cherry Hill e New York City são tratadas como 2 ou 3 entradas separadas.
Tentei citar os nomes de arquivos, assim:
for f in `find test/* -type d | sed -e 's/^/\"/' | sed -e 's/$/\"/'`; do
echo $f
done
mas sem sucesso.
Deve haver uma maneira simples de fazer isso.
As respostas abaixo são ótimas. Mas para tornar isso mais complicado - nem sempre quero usar os diretórios listados no meu diretório de teste. Às vezes, quero passar os nomes de diretório como parâmetros da linha de comando.
Peguei a sugestão de Charles de definir o IFS e criei o seguinte:
dirlist="${@}"
(
[[ -z "$dirlist" ]] && dirlist=`find test -mindepth 1 -type d` && IFS=$'\n'
for d in $dirlist; do
echo $d
done
)
e isso funciona bem, a menos que haja espaços nos argumentos da linha de comando (mesmo que esses argumentos sejam citados). Por exemplo, chamar o script assim: test.sh "Cherry Hill" "New York City"
produz a seguinte saída:
cereja Colina Novo Iorque Cidade
list="$@"
descarta completamente a lista do valor original, recolhendo-o em uma string. Por favor, siga as práticas em minha resposta exatamente como fornecidas - tal tarefa não é incentivada em nenhum lugar; se você quiser passar uma lista de argumentos da linha de comando para um programa, colete-os em uma matriz e expanda-a diretamente.