Como manipular nomes de arquivos com espaços em comandos zenity

1

Estou desenvolvendo um programa de pesquisa da GUI. Preciso de ajuda para manipular nomes de arquivos com espaços. Eu simplesmente não consigo descobrir. Aqui está o meu código:

#!/bin/bash

USERNAME=$(whoami)

INPUT=$(zenity --entry)

updatedb --require-visibility 0 -o ~/.locate.db

FILEMATCHES=$(locate --database ~/.locate.db -i -b -c "$INPUT")
echo "$FILEMATCHES matches found"

if [ $FILEMATCHES == 0 ]; then
    echo "no file matches found"
    exit 1
fi

FOUNDFILES=($(locate --database ~/.locate.db -i -b "$INPUT"))

x=0

while [ $x -lt $FILEMATCHES ]
do
    if [ $x == 0 ]
        then
        echo -n "--list --title FILE-SELECTOR --column serialno. --column file --radiolist TRUE "${FOUNDFILES[$x]}" --width 1000 --height 600" >> /home/$USERNAME/tempzen.txt
        x=$((x+1))
    else
        echo " FALSE ${FOUNDFILES[$x]}" >> /home/$USERNAME/tempzen.txt
        x=$((x+1))
    fi
done

ZEN=$(cat /home/$USERNAME/tempzen.txt)
echo $ZEN

SELECTEDFILE=$(zenity $ZEN)
if [ $? -eq 0 ] 
then
    zenity --progress --pulsate --timeout 2
fi
echo "You have selected $SELECTEDFILE"

EXTENSION=$(file --mime-type $SELECTEDFILE)
echo $EXTENSION
if [ "$SELECTEDFILE" == "" ]
    then
        echo "You didn't select any file to open..."
        rm /home/$USERNAME/tempzen.txt
        exit 1
fi

if [ "$SELECTEDFILE" != "" ] && [ "$EXTENSION" == "$SELECTEDFILE: inode/x-empty" ] || [ "$EXTENSION" == "$SELECTEDFILE: text/plain" ] || [ "$EXTENSION" == "$SELECTEDFILE: application/xml" ]
    then
        gedit $SELECTEDFILE
elif [ "$SELECTEDFILE" != "" ] && [ "$EXTENSION" == "$SELECTEDFILE: image/jpg" ] || [ "$EXTENSION" == "$SELECTEDFILE: image/jpeg" ] || [ "$EXTENSION" == "$SELECTEDFILE: image/gif" ] || [ "$EXTENSION" == "$SELECTEDFILE: image/png" ] || [ "$EXTENSION" == "$SELECTEDFILE: image/bmp" ]
    then
        xdg-open $SELECTEDFILE
elif [ "$SELECTEDFILE" != "" ] && [ "$EXTENSION" == "$SELECTEDFILE: text/html" ]
    then
        firefox $SELECTEDFILE
elif [ "$SELECTEDFILE" != "" ] && [ "$EXTENSION" == "$SELECTEDFILE: application/pdf" ]
    then
        gnome-open $SELECTEDFILE
fi

rm /home/$USERNAME/tempzen.txt

funciona perfeitamente para arquivos sem sacks, mas por exemplo, eu tenho um arquivo chamado muito muito mais recente (com todos esses espaços). Então, quando eu digito que o nome do arquivo de entrada é armazenado como

zenity --list --title FILE-SELECTOR --column serialno. --column file --radiolist TRUE /home/jeevan/very

Portanto, apenas o nome do arquivo até very é armazenado, então a próxima janela de saída de seleção de arquivos também é uma bagunça:

Eu quero que a saída seja

 zenity --list --title FILE-SELECTOR --column serialno. --column file --radiolist TRUE /home/jeevan/very very latest

E na GUI, deve ser /home/jeevan/very very latest .

    
por jeevanreddymandali 13.07.2015 / 18:02

1 resposta

1

Existem dois problemas. O IFS para a saída de locate e o IFS para zenity .

IFS é uma variável do shell que contém uma string de caracteres, e qualquer uma delas quebrará uma string em palavras. O valor usual é ' space tab newline '

Ambos são corrigidos ao definir IFS para uma nova linha imediatamente antes de executar locate .

export IFS='
'
FOUNDFILES=($(locate --database ~/.locate.db -i -b "$INPUT"))

O segundo problema é corrigido por export ing este valor de IFS no ambiente, de modo que também afeta zenity . Isso significa que você também precisa modificar a criação de tempzen.txt para usar novas linhas como separadores de palavras.

if [ $x == 0 ]
    then
    echo -e "--list\n--title\nFILE-SELECTOR\n--column\nserialno.\n--column\nfile\n--radiolist\nTRUE\n${FOUNDFILES[$x]}\n--width\n1000\n--height\n600" >> /home/$USERNAME/tempzen.txt
    x=$((x+1))
else
    echo -e "FALSE\n${FOUNDFILES[$x]}" >> /home/$USERNAME/tempzen.txt
    x=$((x+1))
fi
    
por Martin Thornton 13.07.2015 / 21:42