ホームページ > バックエンド開発 > Golang > ターミナルは成功するのに、ワイルドカードを使用すると go `exec.Command` が失敗するのはなぜですか?

ターミナルは成功するのに、ワイルドカードを使用すると go `exec.Command` が失敗するのはなぜですか?

Patricia Arquette
リリース: 2024-12-08 09:27:12
オリジナル
369 人が閲覧しました

Why Does My Go `exec.Command` Fail with Wildcards While the Terminal Succeeds?

ターミナルは成功したにもかかわらず、ワイルドカードを使用した Golang Exec コマンドが失敗する

Go では、exec パッケージを使用して外部コマンドを実行します。ワイルドカード (「./source-dir/*」) を使用して「mv」コマンドを実行しようとすると、「終了ステータス 1」のエラーが発生し、「そのようなファイルまたはディレクトリはありません」という出力が表示されます。ただし、ワイルドカードを使用してターミナルで同じコマンドを実行すると成功します。

Go でワイルドカードが失敗する理由

シェルとは異なり、シェルはワイルドカードを解釈して、一致するリストに展開します。ファイルの場合、exec パッケージはワイルドカードを文字通り単一の引数として扱います。これは、「mv」コマンドがファイル名のリストではなくワイルドカード (「*」) を認識することを意味します。

解決策

Go でワイルドカードを使用するには、次の 2 つの方法があります。

  1. Use filepath.Glob(): この関数は、次の内容を含む文字列のスライスを返します。指定されたパターンに一致するファイル名のリスト。このリストを「mv」コマンドの引数として使用できます。
import "path/filepath"

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

cmd := exec.Command("mv", files...)
ログイン後にコピー
  1. シェルの呼び出し: シェルを呼び出してコマンドを次のように渡すことができます。引数。シェルがワイルドカードを解釈し、それを適切なリストに展開できるようにします。引数。
cmd := exec.Command("/bin/sh", "-c", "mv ./source-dir/* ./dest-dir")
ログイン後にコピー

再帰的ファイル移動

すべてのファイルをソース ディレクトリから宛先ディレクトリに再帰的に移動するには、ソース ディレクトリを再帰的に反復処理し、移動する必要があります。見つかった各ファイルまたはディレクトリ。ソースにサブディレクトリが含まれている場合は、各サブディレクトリを再帰的に移動するか、ツリーを移動するための機能を提供する os などのパッケージを使用できます。

以上がターミナルは成功するのに、ワイルドカードを使用すると go `exec.Command` が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート