#!/bin/bash # このスクリプトは選択されたディレクトリについて、ルートディレクトリ(/)からの絶対パスによる表記で表します。ディレクトリにシンボリックリンクが貼られている場合、リンク元を使って表示します。 currentdir=$PWD zenity --title="ディレクトリの絶対パスによる表記を見つけ出すスクリプト" --width=400 --info --text="次のウィンドウでは、絶対パスによる表記を知りたいディレクトリを一つだけ選択してください。" dir="$(zenity --title="ディレクトリの絶対パスによる表記を見つけ出すスクリプト" --file-selection --directory)" dirstart="${dir}" if [ "$(echo "$dir"|cut -c1)" != "/" ] then dir="${PWD}/${dir}" fi if [ -n "$(echo "$dir"|tr "/" '\n'|tail -n1)" ] then dir="${dir}/" fi while [ "$(echo "$dir"|grep -G "\/\.\/")" ] do dir="$(echo "$dir"|sed -e "s/\/\.\//\//g")" done while [ "$(echo "$dir"|grep -G "\/[^\/]*[^\/\.]\+[^\/]*\/\.\.\/\|\/\.\{3,\}\/\.\.\/")" ] do dir="$(echo "$dir"|sed -e "s/\/[^\/]*[^\/\.]\+[^\/]*\/\.\.\/\|\/\.\{3,\}\/\.\.\//\//g")" done # ここまでで、$dirの最初は/、最後は/であり、「/./」や「/../」は入っていない。 dir1="$(echo "$dir"|sed -e "s/\([^\/]*\/\)/\1\n/"|head -n1)" dir2="$(echo "$dir"|sed -e "s/\([^\/]*\/\)/\1\n/"|tail -n1)" # ここまでで、$dir1=「/」である。$dir2の最初は/ではなく、最後は/であり、「/./」や「/../」は入っていない。 while [ -n "$dir2" ] do if [ "$(echo "$dir1"|cut -c1)" != "/" ] then dir1="${PWD}/${dir1}" fi cd "$dir1" dir3="$(echo "$dir2"|sed -e "s/\([^\/]*\)\//\1\n/"|head -n1)" # echo チェック用表示: $dir1 , $dir2 , $dir3 if [ "$(ls -l "$dir3"|cut -c1)" = "l" ] then # $dir3(末尾は/ではない)がシンボリックリンク dir4="$(ls -l "$dir3"|sed -e "s/ -> /\n/g"|tail -n1)" if [ "$(echo "$dir4"|cut -c1)" = "/" ] then # $dir4(シンボリックリンクのリンク元)の最初が/ dir="$(echo ${dir4}|sed -e "s/\/$//")/$(echo "$dir2"|sed -e "s/[^\/]*\///")" else # $dir4(シンボリックリンクのリンク元)の最初が/ではない dir="${dir1}$(echo ${dir4}|sed -e "s/\/$//")/$(echo "$dir2"|sed -e "s/[^\/]*\///")" fi if [ -n "$(echo "$dir"|tr "/" '\n'|tail -n1)" ] then dir="${dir}/" fi while [ "$(echo "$dir"|grep -G "\/\.\/")" ] do dir="$(echo "$dir"|sed -e "s/\/\.\//\//g")" done while [ "$(echo "$dir"|grep -G "\/[^\/]*[^\/\.]\+[^\/]*\/\.\.\/\|\/\.\{3,\}\/\.\.\/")" ] do dir="$(echo "$dir"|sed -e "s/\/[^\/]*[^\/\.]\+[^\/]*\/\.\.\/\|\/\.\{3,\}\/\.\.\//\//g")" done # ここまでで、$dirの最初は/、最後は/であり、「/./」や「/../」は入っていない。 dir1="$(echo "$dir"|sed -e "s/\([^\/]*\/\)/\1\n/"|head -n1)" dir2="$(echo "$dir"|sed -e "s/\([^\/]*\/\)/\1\n/"|tail -n1)" else # $dir3がシンボリックリンクではない。 dir1="${dir1}${dir3}/" dir2="$(echo "${dir2}"|sed -e "s/[^\/]*\///")" fi done zenity --title="ディレクトリの絶対パスによる表記を見つけ出すスクリプト" --width=400 --info --text="${dirstart}は$dir1です。" # 作業が終了したら元のディレクトリに戻る。 cd $currentdir exit 0