test -e(ファイル存在チェック)でワイルドカードを使う

wildcard-title

ある拡張子のファイルが存在するかどうか確認したいだけなのに、testコマンドって使えないですよね。

~$ ls
1.bk  2.bk  3.bk
~$ test -e *.bk
bash: test: 引数が多すぎます
~$ 

ワイルドカードでこのように展開されるからですね。

~$ test -e 1.bk 2.bk 3.bk

どうすれば回避できるでしょうか。
lsとheadを使う方法だと、ファイルが存在する場合はうまく行きます。

~$ test -e `ls *.bk | head -1`
~$ echo $?
0
~$ 

存在しない場合は、lsでエラーとなります。

~$ test -e `ls aaaa | head -1`
ls: 'aaaa' にアクセスできません: そのようなファイルやディレクトリはありません
~$ 

エラーの出力をどうにかすれば使えそうですが、そもそもlsとheadの結果でtestへの引数を作っているので、これも使えません。結果が0、つまりファイルが見つかったことになってしまいます。

~$ test -e `ls aaaa 2>/dev/null | head -1`
0
~$ 

findでも同様です。

~$ test -e `find -name aaaa | head -1`
0
~$ 

いっそのことtest -eや、test -fコマンドを諦めてしまう方法や、ワイルドカードで展開される分だけfor文で回してやろう、なんて強引にtestコマンドにこだわる方法もあります。

-zを使って文字列長でのチェック。結果は逆転します。

~$ test -z `find -name aaaa| head -1`;echo $?
0
~$ test -z `find -name '*.bk' | head -1`;echo $?
1
~$ 

for文で全部回してしまう方法。

~$ for i in *.bk;do test -e $i;done;echo $?
0
~$ for i in aaaa;do test -e $i;done;echo $?
1
~$ 

でも、test -eで、すっきり存在チェックしたいだけなのに、lsやfindやheadやforなどに頼っていたら本末転倒でしょう。
要は、引数を限定するだけでよいので、カスタマイズしたtest -eコマンドをつくれば良いです。関数を作ってみましょう。

~$ test-e(){
> test -e $1
> }
~$ 

これでtest -eを使いたいときは、test-eと書けば、ワイルドカードが使えるようになります。

~$ ls
1.bk  2.bk  3.bk
~$ test-e *.bk
~$ echo $?
0
~$ test-e aaaa
~$ echo $?
1
~$ 

3 responses to “test -e(ファイル存在チェック)でワイルドカードを使う

  1. I see your blog needs some unique articles. Writing manually is time consuming, but there is solution for this.
    Just search for; Masquro’s strategies

  2. I see your site needs some fresh & unique content.

    Writing manually is time consuming, but there is solution for this hard task.
    Just search for – Miftolo’s tools rewriter

  3. Hello, I believe your website could be having web browser
    compatibility issues. Whenever I look at your blog in Safari, it
    looks fine however, if opening in Internet Explorer, it’s got some overlapping issues.
    I simply wanted to give you a quick heads up! Aside from that, wonderful
    blog!

Leave a Reply to BrendanGarsi Cancel reply

Your email address will not be published. Required fields are marked *

CAPTCHA