Arquivos com espaço no nome

4

Eu tenho uma variável chamada var que armazena a lista de arquivos dentro de um diretório. Eu loop através de todos os arquivos e se eu encontrar um diretório eu saída "Directory" para a tela. código abaixo:

var=$(ls dir)

for file in $var; do
    if [ -d $dir/$file ]; then
        echo "Directory"
    fi
done

Eu tenho 2 perguntas:

1ª - Eu estou fazendo isso dentro de uma função e eu quero que a variável $ file permaneça local, então quando minha função terminar, eu não obtenho acesso a ela. Como posso definir essa variável local? Eu não posso fazer for local file in $var; e eu não posso declarar $ arquivo antes do loop.

2nd- Meu loop não funciona quando $(ls dir) contém um arquivo que possui um espaço dentro do nome. Por exemplo, se $dir tiver 3 arquivos, arquivo1 arquivo2 e arquivo3, $var só manteria o arquivo1 e o arquivo3 como arquivos reais, mas o arquivo 2 não funcionaria porque o separaria no arquivo e 2. Como posso corrigir o problema dos arquivos que possuem espaço em seus nomes?

    
por Fxbaez 29.12.2015 / 16:56

1 resposta

3

Para tornar $ file local: você pode usar local file antes de atribuir a ele.

Para arquivos com espaços: não analise ls , use um caractere curinga e use aspas duplas em torno de referências de variáveis:

local file
for file in "$dir"/*; do  # Note that $file will contain $dir as well as the filename
    if [ -d "$file" ]; then
        echo "Directory: $file"
    fi
done

Se você quiser armazenar os nomes dos arquivos antes de iniciar o loop, use uma matriz em vez de uma variável simples:

local -a filelist
filelist=("$dir"/*)
local file
for file in "${filelist[@]}"; do
    ...

Veja BashFAQ # 20: "Como posso encontrar e manusear com segurança nomes de arquivos contendo novas linhas, espaços ou ambos?" para exemplos mais complexos e mais truques.

    
por 29.12.2015 / 17:43