tech.guitarrapc.cóm

Technical updates

BashでFileやDirecotryの存在を確認する

シェルスクリプトのワンライナーは色々PowerShellを扱うに当たって勉強になります。 Ruby内部でshを呼び出すときに、変数を用いずにファイルやディレクトリの存在を確認して条件判定をする方法が面白かったのでどうぞ。 ====

-fと-dを利用する

とりあえず実例で。 これは、~/ (ホームディレクトリ)にhoge.shファイル(拡張子.shの「ファイル」を一つ明示しなくてはいけない)存在する場合に、その*.shを~/binにcp (コピー)するワンライナーです。 if ~ testで直接ファイル有無を判定できる所が勉強になります。

if [ -f "~/hoge.sh" ]; then cp *.sh ~/bin ; fi

ディレクトリ判定ならどうするか?簡単です。 -f ではなく -d とすればいいのです。

if [ -d bin ]; then echo "folder exist" ; fi

否定するなら

当然 ! ですね。 例えば、~/binが存在しない場合にbinを作成するならこうです。

if [ ! -d ~/bin ]; then mkdir ~/bin; fi'

testでファイル指定は一つしかできない(ワイルドカード*が使えない)

結構困ります。ようはPowerShellのswtichのようにループしないため何ですが、どちらかというとPowerShellの方が特殊な動きですね。 で、*.shを指定してファイルが存在した場合にbinにコピーするならforで取得して、testに渡せばいいかなと。

for i in `ls -1 *.sh`; do if [ -f $i ]; then cp $i ~/bin ; fi; done

これでファイルのみ取得するのがlsの便利な所です。

ls -1

どんな時に使うの

不要な変数好きなんですか? いらないですよね? あるいは、ssh越しにコマンドを実行せざるを得ない場合、shで取得した変数を利用できない場合にも。 例えば、CapistranoでRuby内部で、コマンドを run で実行する場合などにサクッと書けます。 この辺、PowerShellだと普通に判定ですからね.....ほげ....とはいっても、Test-Pathがあるので楽かなー、というか誰が見ても分かるのは偉大。 (インテリセンスあるし

if(Test-Path ".\bin"){mkdir ~\bin}

New-Item使って書くならこうですね。

 if(!(Test-Path ".\bin")){New-Item -Path ~\bin -ItemType directory}