ワイルドカードの注意点

スポンサーリンク

linuxでシェルを実行していると、曖昧検索のためにワイルドカードを使うことも多いと思います。

この便利なワイルドカードですが、実は注意点があります。

それは、ワイルドカードはシェルが実行しているのです。

スポンサーリンク

実際にやってみましょう

一覧を表示した後に、ワイルドカードを使って検索してみましょう。

[centos@ip-192-168-1-229 test]$ ll
合計 8
-rw-rw-r--. 1 centos centos 0 8月 9 05:59 sample.txt
-rw-rw-r--. 1 centos centos 6 8月 9 04:51 test1.txt
-rw-rw-r--. 1 centos centos 6 8月 9 04:52 test2.txt

[centos@ip-192-168-1-229 test]$ ll test*
-rw-rw-r--. 1 centos centos 6 8月 9 04:51 test1.txt
-rw-rw-r--. 1 centos centos 6 8月 9 04:52 test2.txt
[centos@ip-192-168-1-229 test]$

このll test* ですが、実は

ll test1.txt test2.txt

と展開されて実行されているんです。

だから?と思いますよね

これをcpコマンドで間違ったらどうなるでしょうか?

実験してみましょう。

test1.txtには「test1」、test2.txtには「test2」の内容を記録します。

[centos@ip-192-168-1-229 test]$ more test*
::::::::::::::
test1.txt
::::::::::::::
test1
::::::::::::::
test2.txt
::::::::::::::
test2

この状態で以下のようにcpコマンドを実行します。

[centos@ip-192-168-1-229 test]$ cp test*
[centos@ip-192-168-1-229 test]$ more *
::::::::::::::
sample.txt
::::::::::::::
::::::::::::::
test1.txt
::::::::::::::
test1
::::::::::::::
test2.txt
::::::::::::::
test1
[centos@ip-192-168-1-229 test]$

するとどうでしょう。test2.txtの内容が「test1」になっていますね。

これは、cp test*を実行したときに

cp test1.txt test2.txt

として実行されてしまっているからです。

曖昧検索にヒットするファイルが2ファイルの場合と、引数を間違えた場合にしか実行されませんが、ワイルドカードの動きを知っておいて損はないと思います。

findコマンドはワイルドカードを処理するコマンドです。

ちなみにレベルの話ですが、ファイルを検索するfindコマンドはワイルドカードを処理するコマンドです。

find -name "test*"

注目する部分はダブルクォートの部分です。

ダブルクォートで囲まれた”test*”の部分はシェルで展開せずにfindコマンドにそのまま渡すことになります。

ちなみに、ダブルクォートで囲まずに、

find -name test*

を実行すると、シェルで展開されてしまい、

find -name test1.txt test2.txt

となります。もちろんエラーになりますが、ファイルが1つのみの場合は実行されます。

タイトルとURLをコピーしました