Escape espaços no script bash não funciona [fechado]

1

Nada que eu tentei funciona. Olhe para o grep para as linhas do array no script abaixo. Escapar parece não fazer nada. Mas se eu fizer um array estaticamente atribuído, tudo bem.

Como:

files=(somefile.txt
some\ other\ file.pdf
"yet another file.txt")

Isso não funciona:

#!/bin/bash
find . -name "$1" |
(
        cat - > /tmp/names
        file -N --mime-type --files-from /tmp/names
) |
(
        cat - > /tmp/mimes
#       files=("$(grep -o '^[^:]*' /tmp/mimes)") #one element array
#       files=($(grep -o '^[^:]*' /tmp/mimes)) #files with spaces end up split in to several elements
#       files=($(grep -o '^[^:]*' /tmp/mimes | sed 's/ /\ /g')) #same but with \ terminated strings
        files=($(grep -o '^[^:]*' /tmp/mimes | cat <(echo '"') - <(echo '"')))
        mimes=($(grep -o '[^:]*$' /tmp/mimes))

        total=${#files[*]}
        for (( i=0; i<=$(( $total -1 )); i++ ))
                do
                echo Mime: "${mimes[$i]}" File: "${files[$i]}"
        done
        printf "$i\n"
)

Editar: esclarecimento

arquivo / tmp / mimes contém:

./New Text.txt: text/plain

Se eu o grep para obter tudo antes do ":"

grep -o '^[^:]*' /tmp/mimes

gera: ./New Text.txt

Eu quero colocar essa saída em uma matriz, mas ela tem um espaço, então eu escapei do espaço usando sed.

files=($(grep -o '^[^:]*' /tmp/mimes | sed 's/ /\ /g'))

Isso não funciona. Acabo com arquivos [0]="./New \" e arquivos [1]="Text.txt"

Minha pergunta é por que não está escapando do trabalho espacial?

Se eu fizer:

files=(./New\ Text.txt)

Ele funciona no entanto arquivos [0]="./New Text.txt" Por que o escape quando você faz isso manualmente funciona, mas quando é a saída do grep e sed não funciona. Parece que o comportamento de criar uma matriz é inconsistente.

    
por Geo R 20.11.2016 / 00:55

1 resposta

0

Se você deseja separar nomes de arquivos por novas linhas, defina o IFS como $'\n' e desative o globbing:

set -f
IFS=$'\n' files=($(grep -o '^[^:]*' /tmp/mimes))
set +f

Note que ele quebra se seus nomes de arquivos contiverem novas linhas (além de dois pontos, que são quebrados devido à maneira como você extrai os nomes com o grep).

    
por 20.11.2016 / 01:17