質問: ### 前提・実現したいこと OS:Linux rootユーザーで実行する前提 あるディレクトリの中身(ファイル、フォルダ全て)を別のディレクトリに移動させる場合において、 "ファイル属性を維持したまま"で移動させる方法について教えてください。 後述しますが、mvコマンドではダメなのか、を知りたいです。 ファイル属性とは、ファイルのパーミッション、オーナー、タイムスタンプなどを指します。 ここでは、次のようなディレクトリ構成を例に挙げます。(dir1の中身をdir2に移動させる) dir1 |__subdir1 | |_file1.txt | |_file2.txt |_file3.txt dir2 |__(空っぽ) ### 確認したいこと 方法は次の3つあると考えています。 1.tarコマンドでディレクトリごとアーカイブ→展開 2.cpコマンドでコピー(+ 元ディレクトリ削除) 3.mvコマンド(+ 元ディレクトリ削除) 1、2の方法で実現できそうであることは確認済みなのですが、 容量が大きかったりファイル数が多いと処理に時間がかかってしまうと思います。 その点、mvコマンドでは(理屈は理解しきれてませんが) 容量が大きい場合などでもすぐに移動できるようです。 以下のサイトを参考にしました。 mvでリネームができるわけをどこまで深く話せますか 試しに、10GBのダミーファイルを作って、cp、mvを比較するとたしかにmvの場合はすぐに移動が終わりました。 よって、mvコマンドでファイル属性を維持したまま移動ができるのか否か?を確認させて頂きたいです。 ### コマンド実行例(試したこと) 試したコマンドの実行例をそれぞれ記載しておきます。 * tarコマンドの実行例 ``` tar cf dir1.tar dir1 tar xf dir1.tar -C dir2 --strip-components 1 ``` tarコマンドではファイル属性を維持したままアーカイブ、展開できることを書籍などで学びました。 dir1のディレクトリ構成そのままで展開すると、dir2/dir1/・・・といた構成になってしまうため --strip-components 1 で展開後のディレクトリを1階層(dir1/)切り捨てています。 動作確認は問題ありませんでした。 * cpコマンドの実行例 ``` cp -ap dir1/* dir2/ ``` cpコマンドの場合、-a、-pオプションで属性を維持したままコピーできるようです。 以下のサイトを参考にしました。実際に試してみても問題なさそうです。 【 cp 】コマンド(応用編その2)――属性を保持したままコピーする * mvコマンドの実行例 ``` mv dir1/* dir2/ ``` mvのオプションではcpのような属性に関するオプションは見つけられませんでした。 ネットで検索してもあまり情報が見つけられなかったのですが、以下の記事では 「mvで所定のファイルに移動させると、権限や所有者が変わってしまうことがある」 とあります。 Linuxでのファイルの入れ替え(mvコマンド vs cpコマンド) ただ、これは既存ファイルを上書きした場合の懸念点かなと思っていまして、 先に挙げた例のように、空ディレクトリ(dir2)に移動させる場合とではまた違うのかなとも推測しています。 実際にmvで移動させてみてもパーミッション、オーナー、タイムスタンプは変わっていないようでした。 以上です。よろしくお願いいたします。
回答: 移動先が移動元と同じファイルシステムの中(≒同じパーティションの中)であれば、対象ファイルを読み書きしません。また、移動されるので、 > > 3.mvコマンド(+ 元ディレクトリ削除) > > > 元ディレクトリを削除しようにも存在しません。 ファイルの中身も属性もそのままです。 移動というと動かすように聞こえますが、実際は、名前の付け替えです。 `mv dir1 dest/`は、`dir1`というディレクトリについている`dir1`という名前を消して新しく`dest/dir1`という名前を付けます(下記注)。 つまりラベルの貼り替えだけなので、ラベルの貼られている物は不変です。 パーティションをまたがった`mv`は、`cp`&`rm`です。 注:カレントディレクトリの`dir1`というエントリーを消して、`dest`ディレクトリに`dir1`エントリーを作って、そのエントリーが対象のディレクトリを指すようにリンクづけます。