GUI検索プログラムを開発しています。スペースを含むファイル名を処理するためのヘルプが必要です。私はそれを理解することができません。これが私のコードです:
#!/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
これは、サカのないファイルに対しては完全に機能しますが、たとえば、非常に最新の名前のファイルがあります(これらすべてのスペースが含まれています)。したがって、入力すると、入力ファイル名は次のように保存されます。
zenity --list --title FILE-SELECTOR --column serialno. --column file --radiolist TRUE /home/jeevan/very
したがって、very
までのファイル名のみが保存されるため、次のファイル選択出力ウィンドウも混乱します。
出力を
zenity --list --title FILE-SELECTOR --column serialno. --column file --radiolist TRUE /home/jeevan/very very latest
また、GUIでは/home/jeevan/very very latest
である必要があります。
2つの問題があります。 IFS
の出力の場合はlocate
、IFS
の場合はzenity
。
IFS
は文字列を含むシェル変数であり、いずれも文字列を単語に分割します。通常の値は 'space
tab
newline
'です。
どちらも、IFS
を実行する直前にlocate
を改行に設定することで修正されます。
export IFS='
'
FOUNDFILES=($(locate --database ~/.locate.db -i -b "$INPUT"))
2番目の問題は、このexport
の値を環境にIFS
することで修正されるため、zenity
にも影響します。つまり、改行を単語の区切り文字として使用するには、tempzen.txt
の作成も変更する必要があります。
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