"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が一致しない場合はコマンドをキャンセルしてこの問題を解決しました。

おすすめ記事