[shell] ファイルの存在確認の簡単スニペット

2019年6月5日

テクノロジー プログラミング

たくさんのIT会社の開発部員と話をしてきて、ほとんどのプログラマーがshell言語を軽視していることに気が付きました。 「なんでPythonで書かないの?」とか「phpだけでなんとかなるよ」という風に言っているセリフをよく耳にしますが、「どの言語で書くのが正しいか?」という議論ではなく、「どのくらいの言語でプログラミングできるか」という事の方が興味がある自分としては、特定言語に縛られているエンジニアと話をすると、どうしても物足りないエンジニアという見方をしてしまいます。 プログラム言語って、まるで宗教のように感じるのはおそらくこうした信仰者がいるためかもしれませんね。 できる限り多くの言語が扱えたほうが良いという価値観は誰もが持っているのに、自分の範疇しか興味を示さないエンジニアと話をすると、本当に残念で仕方ありません。 そんな話はどうでもいいのですが、今回は、shell言語を使っている時にたまに発生するファイルやディレクトリの存在可否を備忘録として残しておきます。

shellのファイル・ディレクトリの存在確認

任意のファイルを作る時に、ファイルの親階層になるディレクトリが作成されているか確認して、存在しない場合は、mkdirするという感じです。 また、ファイルをcatする前に、対象のファイル(階層)が存在していなければエラーが変えるので、catする前に存在確認しておく必要もあります。 phpであれば、is_file()関数やis_dir()関数で簡単に確認できますが、shell言語では"-e"オプションだけというもっと簡単に確認できます。 #/bin/sh if [ -e $1 ]; then echo "true" else echo "false" fi 使い方と実行結果は以下のような感じです。 $ sh is_file.sh /var/www/html/ true $ sh is_file.sh /var/www/html/hoge.txt false trueとfalseの返り値は利用しやすいように変更して使えますし、その場所に処理を書いてしまうことも可能です。

shell言語のif文は高機能

数行のプログラムなので解説はさほど必要ないかもしれませんが、"-e"オプションでファイルやディレクトリの存在確認をしているだけなのですが、実はshell言語のif文で使えるオプションは、非常に色々な種類があり、機能豊富なのです。 ざっくりまとめてみると以下のような感じです。
オプション説明サンプル
-epathの存在確認-e path
-dディレクトリの存在確認-d path
-fファイルの存在確認-f path
-sファイルの容量が0より大きければtrue-s path
-rpathが読み取り専用であればtrue-r path
-wpathが書き込み可能であればtrue-w path
-xpathが実行可能であればtrue-x path
-zファイルの容量が0であればtrue-z path
-nファイルの容量が0より大きければtrue-n path
if文には、他にも比較オプションなどもあるので、興味のある人はリファレンスページなどで勉強してみましょう。

参考

shell言語のif文をわかりやすくまとめてくれています。 https://shellscript.sunone.me/if_and_test.html

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。