• ベストアンサー

kshのスクリプトでワイルドカードがうまく動作しな

スクリプトtest.kshの中で、以下のようなコードを書いています。 mv /hogehoge1/* /hogehoge2/ 実行すると以下のようなエラーがでます。 mv: cannot stat '/hogehoge/*' : そのようなファイル、ディレクトリはありません。 ksh -x test.ksh で実行すると、 アスタリスクが展開されて以下のように実行されているようです。 mv /hogehoge/aaa /hogehoge/bbb /hogehoge/ccc /hogehoge2/ どうしたらターミナルで叩いたときと同じようにファイルの移動ができますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

> アスタリスクが展開されて以下のように実行されているようです。 > mv /hogehoge/aaa /hogehoge/bbb /hogehoge/ccc /hogehoge2/ というのは、シェルとして正しい動作に思えますが?(/hogehogeの下にaaa,bbb,cccというファイル、またはディレクトリがある、として) コマンドラインから mv /hogehoge/* /hogehoge2/ としたときも、同じ展開が行われます。通常はそれが表示されないだけです。 unix系のシェルでは、*や?等の「ワイルドカード」を解釈して、該当するファイル名に展開するのは「シェルの仕事」であって、mvやcp等のコマンドではそのような変換やファイル検索は行いません。 > mv: cannot stat '/hogehoge/*' : そのようなファイル、ディレクトリはありません。 というのは ・/hogehoge/*をkshが展開...しようとしたが、該当するファイルが無いので展開されず、そのままmvへ引き渡す ・mv で /hogehoge/* と言う名前のファイルまたはディレクトリを/hogehoge2/へ移動する...つもりが存在しないのでエラー ということだと思います。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> mv /hogehoge1/* /hogehoge2/ は mv /hogehoge/* /hogehoge2/ の間違いでよろしいでしょうか。 そして、test.kshはこれで全部でしょうか? /hogehoge は/で始まる絶対パスですか?それとも実際は相対パスですか? どっかで set -f や set -o noglob とかで展開が無効になっているとか無いですか?

palayo
質問者

補足

mv /hogehoge/* /hogehoge2/ でよいです。絶対パスです。 > どっかで set -f や set -o noglob とかで展開が無効になっているとか無いですか? それはないです。展開はされていますが、展開されてコマンドが以下のように認識されてしまうようです。 > mv /hogehoge/aaa /hogehoge/bbb /hogehoge/ccc /hogehoge2/

すると、全ての回答が全文表示されます。

関連するQ&A