#!/bin/bash option=$(zenity --title="ディレクトリへのシンボリックリンク作成ツール" --list --checklist --text="このツールではディレクトリへのシンボリックリンクを作成します。希望するオプションにチェックしてください" --multiple --column="↓チェック" --column="" --column="オプション" 1 1 "生成するリンクの名前を自分で入力する(これをチェックしない場合、できる限りリンク先と同じ名前にします)" 2 2 "絶対パスでリンクする(これをチェックしない場合、相対パスにします)") if [ $? = 1 ] then zenity --title="ディレクトリへのシンボリックリンク作成ツール" --info --text="キャンセルが押されたので、終了します。" exit 0 fi if [ a$(echo $option|grep 1) = "a" ] then entername=0 else entername=1 fi if [ a$(echo $option|grep 2) = "a" ] then fullpath=0 else fullpath=1 fi zenity --title="ディレクトリへのシンボリックリンク作成ツール" --info --text="次のウィンドウでは、その中にリンクを作成するディレクトリを1つだけ選択してください。" savedir=$(zenity --title="ディレクトリへのシンボリックリンク作成ツール" --file-selection --directory) if [ $? = 1 ] then zenity --title="ディレクトリへのシンボリックリンク作成ツール" --info --text="キャンセルが押されたので、終了します。" exit 0 fi currentdir=$PWD if [ "$(echo "$savedir"|cut -c1)" != "/" ] then savedir="${PWD}/${savedir}" fi if [ -n "$(echo "$savedir"|tr "/" '\n'|tail -n1)" ] then savedir="${savedir}/" fi while [ "$(echo "$savedir"|grep -G "\/\.\/")" ] do savedir="$(echo "$savedir"|sed -e "s/\/\.\//\//g")" done while [ "$(echo "$savedir"|grep -G "\/[^\/]*[^\/\.]\+[^\/]*\/\.\.\/\|\/\.\{3,\}\/\.\.\/")" ] do savedir="$(echo "$savedir"|sed -e "s/\/[^\/]*[^\/\.]\+[^\/]*\/\.\.\/\|\/\.\{3,\}\/\.\.\//\//g")" done # ここまでで、$savedirの最初は/、最後は/であり、「/./」や「/../」は入っていない。 savedir1="$(echo "$savedir"|sed -e "s/\([^\/]*\/\)/\1\n/"|head -n1)" savedir2="$(echo "$savedir"|sed -e "s/\([^\/]*\/\)/\1\n/"|tail -n1)" # ここまでで、$savedir1=「/」である。$savedir2の最初は/ではなく、最後は/であり、「/./」や「/../」は入っていない。 while [ -n "$savedir2" ] do if [ "$(echo "$savedir1"|cut -c1)" != "/" ] then savedir1="${PWD}/${savedir1}" fi cd "$savedir1" savedir3="$(echo "$savedir2"|sed -e "s/\([^\/]*\)\//\1\n/"|head -n1)" # echo チェック用表示: $savedir1 , $savedir2 , $savedir3 if [ "$(ls -l "$savedir3"|cut -c1)" = "l" ] then # $savedir3(末尾は/ではない)がシンボリックリンク savedir4="$(ls -l "$savedir3"|sed -e "s/ -> /\n/g"|tail -n1)" if [ "$(echo "$savedir4"|cut -c1)" = "/" ] then # $savedir4(シンボリックリンクのリンク元)の最初が/ savedir="$(echo ${savedir4}|sed -e "s/\/$//")/$(echo "$savedir2"|sed -e "s/[^\/]*\///")" else # $savedir4(シンボリックリンクのリンク元)の最初が/ではない savedir="${savedir1}$(echo ${savedir4}|sed -e "s/\/$//")/$(echo "$savedir2"|sed -e "s/[^\/]*\///")" fi if [ -n "$(echo "$savedir"|tr "/" '\n'|tail -n1)" ] then savedir="${savedir}/" fi while [ "$(echo "$savedir"|grep -G "\/\.\/")" ] do savedir="$(echo "$savedir"|sed -e "s/\/\.\//\//g")" done while [ "$(echo "$savedir"|grep -G "\/[^\/]*[^\/\.]\+[^\/]*\/\.\.\/\|\/\.\{3,\}\/\.\.\/")" ] do savedir="$(echo "$savedir"|sed -e "s/\/[^\/]*[^\/\.]\+[^\/]*\/\.\.\/\|\/\.\{3,\}\/\.\.\//\//g")" done # ここまでで、$savedirの最初は/、最後は/であり、「/./」や「/../」は入っていない。 savedir1="$(echo "$savedir"|sed -e "s/\([^\/]*\/\)/\1\n/"|head -n1)" savedir2="$(echo "$savedir"|sed -e "s/\([^\/]*\/\)/\1\n/"|tail -n1)" else # $savedir3がシンボリックリンクではない。 savedir1="${savedir1}${savedir3}/" savedir2="$(echo "${savedir2}"|sed -e "s/[^\/]*\///")" fi done savedir="$(echo ${savedir1}|sed -e "s/\/$//")" cd $savedir zenity --title="ディレクトリへのシンボリックリンク作成ツール" --info --text="次のウィンドウでは、リンク元のディレクトリを選択してください。" origin=$(zenity --title="ディレクトリへのシンボリックリンク作成ツール" --file-selection --directory --multiple --separator=" ") if [ $? = 1 ] then zenity --title="ディレクトリへのシンボリックリンク作成ツール" --info --text="キャンセルが押されたので、終了します。" exit 0 fi for a in $origin do if [ $fullpath = 0 ] then savedir1=$savedir savedir1=$(echo $savedir1|cut -c2-) link=$(echo $a|cut -c2-) until [ a$(echo $link|grep \/) = "a" -o a${savedir1} = "a" ] do if [ a$(echo $link|sed -e "s/\//\n/g"|head -n 1) = a$(echo $savedir1|sed -e "s/\//\n/g"|head -n 1) ] then num=$(expr $(echo $link|sed -e "s/\//\n/g"|head -n 1|wc -c) + 1) link=$(echo $link|cut -c${num}-) savedir1=$(echo $savedir1|cut -c${num}-) else break fi done if [ a$savedir1 = "a" ] then num=0 else num=$(echo $savedir1|sed -e "s/\//\n/g"|wc -l) fi while [ $num -gt 0 ] do link="../"${link} num=$(expr $num - 1) done else link="$a" fi linkname=$(echo $a|sed -e "s/\//\n/g"|tail -n 1) if [ $entername = 1 ] then nautilus ${savedir} && sleep 2 linkname=$(zenity --title="ディレクトリへのシンボリックリンク作成ツール" --entry --entry-text=${linkname} --text="${link}へのリンクの名前を入力してください。ただし、リンクを作成するディレクトリが別ウィンドウで開いたはずです。そこに無い名前にしてください。") if [ $? = 1 ] then zenity --title="ディレクトリへのシンボリックリンク作成ツール" --info --text="キャンセルが押されたので、終了します。" exit 0 fi fi while [ -e "${savedir}/${linkname}" ] do nautilus ${savedir} && sleep 2 linkname=$(zenity --title="ディレクトリへのシンボリックリンク作成ツール" --entry --text="生成したいリンク${savedir}/${linkname}が存在します。リンクを作成するディレクトリ${savedir}が別ウィンドウで開かれたはずです。存在しない名前をリンクの名前として入力してください。") if [ $? = 1 ] then zenity --title="ディレクトリへのシンボリックリンク作成ツール" --info --text="キャンセルが押されたので、終了します。" exit 0 fi done ln -s "${link}" "${linkname}" if [ $? = 1 ] then zenity --warning --title="ディレクトリへのシンボリックリンク作成ツール" --text="${savedir}/${linkname}を作成できません。\nおそらく${savedir}への書き込み権限がありません。\n書き込み権限があるディレクトリを指定してください。\nリンクを作成せずに終了します。" exit 0 fi done exit 0