質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

17705閲覧

Linuxでファイル属性を維持したままフォルダ移動する方法について

m-oka-system

総合スコア1

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

2クリップ

投稿2020/10/13 14:40

前提・実現したいこと

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コマンドの実行例

bash

1tar cf dir1.tar dir1 2tar xf dir1.tar -C dir2 --strip-components 1

tarコマンドではファイル属性を維持したままアーカイブ、展開できることを書籍などで学びました。
dir1のディレクトリ構成そのままで展開すると、dir2/dir1/・・・といた構成になってしまうため
--strip-components 1 で展開後のディレクトリを1階層(dir1/)切り捨てています。
動作確認は問題ありませんでした。

  • cpコマンドの実行例

bash

1cp -ap dir1/* dir2/

cpコマンドの場合、-a、-pオプションで属性を維持したままコピーできるようです。
以下のサイトを参考にしました。実際に試してみても問題なさそうです。

【 cp 】コマンド(応用編その2)――属性を保持したままコピーする

  • mvコマンドの実行例

bash

1mv dir1/* dir2/

mvのオプションではcpのような属性に関するオプションは見つけられませんでした。
ネットで検索してもあまり情報が見つけられなかったのですが、以下の記事では
「mvで所定のファイルに移動させると、権限や所有者が変わってしまうことがある」
とあります。

Linuxでのファイルの入れ替え(mvコマンド vs cpコマンド)

ただ、これは既存ファイルを上書きした場合の懸念点かなと思っていまして、
先に挙げた例のように、空ディレクトリ(dir2)に移動させる場合とではまた違うのかなとも推測しています。
実際にmvで移動させてみてもパーミッション、オーナー、タイムスタンプは変わっていないようでした。

以上です。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

移動先が移動元と同じファイルシステムの中(≒同じパーティションの中)であれば、対象ファイルを読み書きしません。また、移動されるので、

3.mvコマンド(+ 元ディレクトリ削除)

元ディレクトリを削除しようにも存在しません。

ファイルの中身も属性もそのままです。

移動というと動かすように聞こえますが、実際は、名前の付け替えです。
mv dir1 dest/は、dir1というディレクトリについているdir1という名前を消して新しくdest/dir1という名前を付けます(下記注)。
つまりラベルの貼り替えだけなので、ラベルの貼られている物は不変です。

パーティションをまたがったmvは、cp&rmです。

注:カレントディレクトリのdir1というエントリーを消して、destディレクトリにdir1エントリーを作って、そのエントリーが対象のディレクトリを指すようにリンクづけます。

投稿2020/10/13 15:04

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m-oka-system

2020/10/14 00:39

回答ありがとうございます。わかりやすいご説明助かります。 同じファイルシステム内のmvであれば属性は変わらず、名前を変えているだけである、 よって、ファイル容量によらず処理もすぐに終わるということですね。 今回のケースでは移動と言いながらも単に「ディレクトリを跨いだリネーム」なのだと理解しました。 「目からウロコ」です。。 理解が深まりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問