スクリプトファイルには次のコードがあります。
if [ ! -d $dir ]; then
cd $dir/..
git clone http://...
fi
もちろん、書かれているようにこれは$dir
存在しないので動作しません。ここでトップレベルのディレクトリを削除する良い方法はありますか?
答え1
パラメータ拡張を使用してパスの最後のステップを削除します。既存のディレクトリが見つかるまでループでこれを行います。
while [[ $dir && ! -d $dir ]] ; do
dir=${dir%/*}
done
if [[ -d $dir ]] ; then
echo $dir exists.
fi
答え2
chkdir() for d do ${d:+:} continue
( cd -- "$d" && d= ||
while cd -- "${d%"${d#*/}"}." && ! {
[ -n "${d##*/*}" ] && break
}; do d=${d#*/}; d=${d#"${d%%[!/]*}"}; done
pwd -P; printf "${d:+./%s\n}\n" "$d"
); done 2>/dev/null
これは、入力するすべてのパスを処理する必要がある小さな関数です。単にディレクトリに直接変更できない場合は、ツリーを巡回しようとします。切断する必要があるときに循環を破ります。複数のパラメータを処理します。それぞれのディレクトリへの完全な標準パスを印刷するか、インポートした内容を印刷します。それから引数パスに残っているものは何でも可能です。空のパラメータはスキップされます。
これが実際に動作するものです:
$ chkdir /tmp/chrome/some/nonexistent/path .. ../test *
/tmp/chrome
./some/nonexistent/path
/home/mikeserv
/home/mikeserv/test
/home/mikeserv/test
./file1
/home/mikeserv/test
./file2
/home/mikeserv/test
./file3
最後のリダイレクトを削除しstderr
てデバッグを有効にすると、どのように機能するかを確認できます。
+ chkdir .. ///tmp/.//////chrome/not/
+ : continue
+ cd -- ..
+ d=
+ pwd -P
/home/mikeserv
+ printf \n
+ : continue
+ cd -- ///tmp/.//////chrome/not/
dash: 2: cd: can't cd to ///tmp/.//////chrome/not/
+ cd -- /.
+ [ -n ]
+ d=//tmp/.//////chrome/not/
+ d=tmp/.//////chrome/not/
+ cd -- tmp/.
+ [ -n ]
+ d=.//////chrome/not/
+ d=.//////chrome/not/
+ cd -- ./.
+ [ -n ]
+ d=/////chrome/not/
+ d=chrome/not/
+ cd -- chrome/.
+ [ -n ]
+ d=not/
+ d=not/
+ cd -- not/.
dash: 3: cd: can't cd to not/.
+ pwd -P
/tmp/chrome
+ printf ./%s\n\n not/
./not/