ホームページ >バックエンド開発 >Golang >ワイルドカードを含む「mv」の動作が Go と Bash で異なるのはなぜですか?

ワイルドカードを含む「mv」の動作が Go と Bash で異なるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-10 18:48:11929ブラウズ

Why Does `mv` with Wildcards Behave Differently in Go and Bash?

Go と Bash での mv コマンドの異なる実行

Go では、exec パッケージを使用して mv コマンドを実行すると、使用時に問題が発生する可能性がありますコマンド引数には「*」などのワイルドカードを使用します。コマンドはターミナルでは期待どおりに機能しますが、アスタリスク ワイルドカードは Go スクリプトでは機能しないようです。

この不一致の理由は、シェルと Go がコマンド引数を処理する方法にあります。ターミナルでは、シェルがワイルドカードを解釈し、一致するファイル名のリストに置き換えます。ただし、Go では、コマンドは文字列として渡され、ワイルドカードを文字通り引数の一部として認識します。

この問題を回避するには、2 つのオプションがあります:

ワイルドカードを手動で展開します

Go の filepath.Glob 関数を使用して、ワイルドカードに一致するファイルのリストを取得できますパターンを作成し、個々のファイル名を引数として exec.Command に渡します。例:

files, err := filepath.Glob("./source-dir/*")
if err != nil {
    // Error handling
}

cmd := exec.Command("mv", files, "./dest-dir")

シェル呼び出しを使用

シェル自体を呼び出して、ワイルドカードを使用して mv コマンドを実行できます。シェルはワイルドカードを解釈し、展開された引数を mv コマンドに渡します。例:

cmd := exec.Command("/bin/sh", "-c", "mv ./source-dir/* ./dest-dir")

これらのアプローチのいずれかを使用すると、Go スクリプトでワイルドカードが正しく処理されるようになり、意図したとおりに mv コマンドを実行できるようになります。

以上がワイルドカードを含む「mv」の動作が Go と Bash で異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。