"sudo mv home/* *"コマンドは何をしますか? [コピー]

"sudo mv home/* *"コマンドは何をしますか? [コピー]

私はこのコマンドのすべての部分を知っています。

sudo mv home/* *
  • sudo:スーパーユーザーはroot権限で実行します。
  • mv:ファイルまたはディレクトリを移動します。
  • home/*:mvコマンドのパラメータ。ホームディレクトリの内容を示します。アスタリスクは、*現在のディレクトリでアルファベット順に並べられたファイルのリストに展開されるワイルドカード文字です。

次のパラメータは運命フォルダです。ただし、ターゲットディレクトリにアスタリスクを指定してコマンドを実行すると、フォルダは完全に消えます。それでは*、この場合は何ですか?

答え1

home/*シェルはグローバル変数であり、*最初にシェルによって拡張されます(したがって、ここではスーパーユーザー権限ではなくユーザー自身で実行されます)。結果は次のとおりです。それからコマンドの引数として渡されます。

したがって、、、、が含まれてhomeいて、現在のディレクトリに、、、、、が含まれている場合、受け取られるパラメータは、、、、、です。....hiddenu1u2....hidden-ixymvmvhome/u1home/u2-ixy

mvGNUなどの一部の実装には、引数がフィーチャmv-始まるバグ機能があります。-i-imvsudo

yターゲットディレクトリとして扱われ、ディレクトリタイプ(またはディレクトリへのシンボリックリンク)の場合、mvそのファイルはそのディレクトリから消えます。y

mv*or 引数は表示されませんhome/*(もちろん実際にそのような名前のファイルがある場合を除く)。ただし、一部のシェル(たとえば、ほとんどのBourne様シェル)には、globがファイルと一致しない場合、変更されていない(拡張されていない)コマンドに渡される欠陥があります。

したがって、現在のディレクトリに隠されたファイルのみが含まれている場合、これはmv最後の引数として受け取られます。特別な処理は行われないため(シェルの役割はglobを理解することです)、ターゲットディレクトリのリテラル名として扱われます。非表示のファイルが存在しない場合、ディレクトリは存在しなくなり、存在しないターゲットディレクトリのエラーのみが報告されます。 inのみの場合、現在のディレクトリに名前が変更されます。*mv**mv home/u1 home/u2 *u1homemv home/u1 *mvhome/u1*

このバグ機能は1979年にBourneシェルによって導入されました。以前のバージョンの Unix では、(および変更していない csh でも) glob 一致がない場合、コマンドはキャンセルされます。その後、globは/etc/globヘルパーによって拡張されます(したがってglobという名前が付けられます)。 1 つ以上の glob がファイルと一致すると、一致しない glob が削除されます。したがって、csh / tcsh(またはzsh -o cshnullglob)でmv home/* *隠されていないファイルがない現在のディレクトリは。mv home/u1 home/u2u1u2

zshor fish(または)などの最新のシェルでは、bash -o failglobglobが一致しない場合はコマンドをキャンセルしてこの問題を解決しました。

答え2

これはすべて、シェルのワイルドカードパターンが拡張されるターゲットによって異なります。

次の 3 つの操作のいずれかを実行します。

  1. *コマンドの最後の拡張が名前リストで、リストの最後の項目が名前の場合目次、コマンドは、すべてhome/*の拡張項目と*拡張されたすべての項目(最後のディレクトリ名を除く)をそのディレクトリに移動します。別のファイルに展開され、ターゲットディレクトリにまだディレクトリが含まれていない場合は、ターゲットディレクトリのディレクトリと一致home/*するファイルとディレクトリが検索されます。homehome/*home

  2. *コマンドの最後の拡張が名前リストで、リストの最後の項目が名前の場合いいえディレクトリにある場合、コマンドでエラーが発生します。

  3. *まったく拡張されないと(現在のディレクトリが空であるため)、エラーが発生します。

GNU coreutilsを使用しmvていて、最後の*名前がダッシュで始まる1つ以上の名前と一致する場合、mvオプションが名前を解釈する方法によっては、コマンドの機能が変更されることがあります。

答え3

このプログラムを直接実行すると、ターゲットフォルダにというフォルダが作成され、そのプログラム*からインポートされたソースファイルも削除されます。いくつかのテストの後、*「ディレクトリではありません」という予想される動作が返され、名前付きの*新しいディレクトリは作成されません。

echo *私はこれが彼のファイルが消えてから戻ってきたと言いながら、尋ねられた質問ともっと一致すると信じています*

関連情報