「UNIX環境の高度なプログラミング」で説明されている「mv」操作

「UNIX環境の高度なプログラミング」で説明されている「mv」操作

存在するUNIX環境の高度なプログラミング(書籍)i ノードとディレクトリを説明するセクション 4.14 には、次の段落があります。

ファイルシステムを変更せずにファイル名を変更する場合は、ファイルの実際の内容を移動する必要はありません。必要なのは、既存のiノードを指す新しいディレクトリエントリを追加してから、古いディレクトリエントリのリンクを解除することだけです。たとえば、ファイル名をに変更するには、/usr/lib/fooディレクトリが同じファイルシステムにある場合は/usr/foofooの内容を移動する必要はありません。これは通常、コマンドがどのように機能するかです。/usr/lib/usrmv

これによれば、ファイルのファイル名にはファイルパスを含める必要があり、「mv」は実際にはファイルを移動しません。しかし、同じディレクトリにある2つのファイルを移動するのにかかる時間は、サイズによってなぜ異なるのですか?

答え1

  1. パス名は、ルートディレクトリに再ルーティングされるファイルのディレクトリエントリから推測されます/
  2. ファイル名はそのディレクトリに保存されるため、同じ「ファイル」を2つの異なるエントリから同時に呼び出すことができます。
  3. 同じファイルシステム内でファイルを移動するのに必要な時間は、ファイルサイズとは関係ありません。

あなたの声明に関して:

ファイル名にはファイルパスを含める必要があります。

本文にはそのような言葉やそのような言葉はまったくありません。もし引用していない部分がありますか?

mv実際にファイルを移動するわけではありません。

はい、そうです。ファイルは新しい名前で新しいディレクトリに保存され、古いディレクトリから削除されます。これは移動ですがコピーではありません(ファイルの内容は移動されず、ファイルシステムの場所のみが移動されます)。

たとえば、/usr/lib/fooファイルの名前を/usr/fooに変更するには、/usr/libと/usrディレクトリが同じファイルシステムにある場合は、fooの内容を移動する必要はありません。

パスはディレクトリ内の/usr/lib/fooファイル名で区切られます。同じ内容は次のように分けられます。が同じファイルシステムにある場合、名前変更はAND操作になります(ファイルシステムのファイルの場所が移動され、ファイルの内容は変更されません)。foo/usr/lib/usr/foofoo/usr/usr/usr/liblinkunlink

関連情報