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 サイトの他の関連記事を参照してください。