fc2ブログ

ファイルへのシンボリックリンク作成ツール ver.2

Ubuntu9.04用のGTKツール(GUI版)です。他のバージョンでも正常に動作するかもしれません。

ファイルへのシンボリックリンクを作成します。要は
ln -s
ですが、絶対パスだけではなく相対パスでのリンクも作成できます。また、ファイルやディレクトリの選択をGUIでできます。作成しようとしたリンクと同じ名前のファイルがあったら、警告を表示して存在しないファイル名を入力するように促します。

リンクを作成するディレクトリ(の上部のディレクトリ)の中にシンボリックリンクや./や../が入っていても、本体を探して正しくリンクしますが、名前に「/」が連続して2つ以上続いているか、もしくは名前自体に「 -> 」が含まれているとになっていると、リンクが無効になる場合があります。

以下のファイルをダウンロード(右クリックして保存)してファイル名をgtk_ln-s2.shに変えてください。
gtk_ln-s2.txt

そして、Ubuntuなどの端末でダウンロードしたファイルの存在するディレクトリに移動して、
$ bash ./gtk_ln-s2.sh
で実行してください。
もしくはダウンロードしたファイルを右クリックして「プロパティ」ー「アクセス権」で
「プログラムとして実行できる」にチェックすれば、
ダブルクリックで「実行する」をクリックすることでも使えるようになります。

gtk_ln-s2.txt
の内容は以下のとおりです。


#!/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 $currentdir
cd $savedir
zenity --title="シンボリックリンク作成ツール" --info --text="次のウィンドウでは、リンク元のファイルを選択してください。"
origin=$(zenity --title="シンボリックリンク作成ツール" --file-selection --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
linkname=$(zenity --title="シンボリックリンク作成ツール" --entry --entry-text=${linkname} --text="${link}へのリンクの名前を入力してください。ただし、リンクを作成するディレクトリには以下のファイル:$(ls)があるので、上記以外にしてください。")
if [ $? = 1 ]
then
zenity --title="シンボリックリンク作成ツール" --info --text="キャンセルが押されたので、終了します。"
exit 0
fi
fi
while [ -e "${savedir}/${linkname}" ]
do
linkname=$(zenity --title="シンボリックリンク作成ツール" --entry --text="生成したいリンク${savedir}/${linkname}が存在します。リンクを作成するディレクトリ${savedir}には以下のファイル:$(ls)があるので、上記以外の名前をリンクの名前として入力してください。")
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

関連記事

テーマ : Linux
ジャンル : コンピュータ

コメントの投稿

管理者にだけ表示を許可する

プロフィール

kiyoshi

Author:kiyoshi
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
since 2011/9/25
現在の閲覧者数: