謙虚なmv コマンドは、遭遇するすべてのPOSIXボックスにある便利なツールの1つです。その仕事は明確に定義されており、それはうまくいきます。ファイルシステム内のある場所から別の場所にファイルを移動します。しかし、Linuxは柔軟性がないとしても何もありません。また、ファイルを移動するための他のオプションがあります。さまざまなツールを使用すると、特定のユースケースに完全に適合する小さな利点が得られます。
mvから離れすぎる前に 、このコマンドのデフォルトの結果を見てください。まず、ディレクトリを作成し、権限が777に設定されたファイルをいくつか生成します。
$ mkdir example
$ touch example/{foo,bar,baz}
$ for i in example/*; do ls /bin > "${i}"; done
$ chmod 777 example/*
おそらくこのようには考えていませんが、ファイルはインデックスノード(一般にiノードとして知られています)と呼ばれるエントリとして存在します。 )、ファイルシステム内。 lsコマンドとその-inodeを使用して、ファイルが占めるiノードを確認できます。 オプション:
$ ls --inode example/foo
7476868 example/foo
テストとして、そのファイルをサンプルディレクトリから現在のディレクトリに移動し、ファイルの属性を表示します。
$ mv example/foo .
$ ls -l -G -g --inode
7476868 -rwxrwxrwx. 1 29545 Aug 2 07:28 foo
ご覧のとおり、元のファイルと既存の権限は「移動」されていますが、iノードは変更されていません。
Linuxターミナル
- Linux用の上位7つのターミナルエミュレータ
- Linuxでのデータ分析のための10個のコマンドラインツール
- 今すぐダウンロード:SSHチートシート
- 高度なLinuxコマンドのチートシート
- Linuxコマンドラインチュートリアル
それがmvのやり方です ツールはファイルを移動するようにプログラムされています:iノードを変更せずに(ファイルが別のファイルシステムに移動されている場合を除き)、その所有権と権限を保持します。
他のツールはさまざまなオプションを提供します。
一部のシステムでは、移動アクションは真の移動アクションです。ビットはファイルシステムのあるポイントから削除され、別のポイントに再割り当てされます。この振る舞いは大部分が支持されなくなっています。移動アクションは、属性の再割り当て(iノードがファイル組織内の別の場所を指すようになりました)またはコピーアクションとそれに続く削除アクションの融合のいずれかになりました。
この設計の哲学的な目的は、次のことを確認することです。つまり、移動が失敗した場合、ファイルはバラバラに残されません。
cp mv とは異なり、コマンド 、ファイルシステムに新しいデータオブジェクトを作成します。新しいiノードの場所があり、アクティブなumaskの影響を受けます。 cpを使用して移動を模倣できます およびrm (または、持っている場合はゴミ箱に)コマンド:
$ cp example/foo .
$ ls -l -G -g --inode
7476869 -rwxrwxr-x. 29545 Aug 2 11:58 foo
$ trash example/foo
新しいfoo この例のファイルは、場所のumaskが書き込み権限を明確に除外しているため、775の権限を取得しました:
$ umask
0002
umaskの詳細については、ファイルのアクセス許可に関するAlexJuarezの記事をご覧ください。
猫(またはタック)を使用して、コピーと削除に似ています 、さらに言えば)コマンドは、「移動された」ファイルが作成されるときに異なる権限を割り当てます。 fooのない新しいテスト環境を想定しています 現在のディレクトリ:
$ cat example/foo > foo
$ ls -l -G -g --inode
7476869 -rw-rw-r--. 29545 Aug 8 12:21 foo
$ trash example/foo
今回は、事前の権限が設定されていない新しいファイルが作成されました。結果は完全にumask設定の影響を受けます。これは、ユーザーとグループの許可ビットをブロックしません(umaskに関係なく、実行可能ビットは新しいファイルに付与されません)が、他のビットからの書き込み(値2)ビットをブロックします。結果は、664の権限を持つファイルです。
Rsync
rsync コマンドは、ホストとファイルシステムの場所の間でファイルを送信するための堅牢な多目的ツールです。このコマンドには、宛先をソースにミラーリングする機能など、多くのオプションを使用できます。
rsync を使用して、ファイルをコピーしてから削除できます -remove-source-filesを使用する オプションと、同期を実行するために選択した他のオプション(一般的な汎用オプションは-アーカイブ) ):
$ rsync --archive --remove-source-files example/foo .
$ ls example
bar baz
$ ls -lGgi
7476870 -rwxrwxrwx. 1 seth users 29545 Aug 8 12:23 foo
ここでは、ファイルのアクセス許可と所有権が保持され、タイムスタンプが更新され、ソースファイルが削除されたことがわかります。
警告の言葉: このオプションを-削除と混同しないでください 、宛先からファイルを削除します ディレクトリ。誤用-削除 ほとんどのデータを消去できます。テスト環境を除いて、このオプションは避けることをお勧めします。
これらのデフォルトの一部を上書きして、権限と変更設定を変更できます。
$ rsync --chmod=666 --times \
--remove-source-files example/foo .
$ ls example
bar baz
$ ls -lGgi
7476871 -rw-rw-r--. 1 seth users 29545 Aug 8 12:55 foo
ここでは、宛先のumaskが尊重されるため、-chmod =666 オプションを選択すると、664個の権限を持つファイルになります。
ただし、メリットは権限だけではありません。 rsync コマンドには多くの便利なオプションがあります(そのうちの少なくとも-除外 フラグを立てて、アイテムを大規模な移動操作から除外できるようにします)。これにより、単純な mvよりも堅牢なツールになります。 指図。たとえば、ファイルのコレクションを移動するときにすべてのバックアップファイルを除外するには:
$ rsync --chmod=666 --times \
--exclude '*~' \
--remove-source-files example/foo .
インストール コマンドは、特に開発者向けのコピーコマンドであり、ほとんどの場合、ソフトウェアコンパイルのインストールルーチンの一部として呼び出されます。ユーザーの間ではあまり知られていませんが(パッケージマネージャーの頭字語とペットの名前だけを残して、なぜこのような直感的な名前が付けられたのか疑問に思うことがよくあります)、インストール 実際には、ファイルを必要な場所に配置するのに便利な方法です。
インストールには多くのオプションがあります -backupを含むコマンド および-比較 コマンド(ファイルの新しいコピーの「更新」を回避するため)。
cpとは異なり と猫 、ただし mvとまったく同じです 、インストール コマンドは、タイムスタンプを保持しながらファイルをコピーできます:
$ install --preserve-timestamp example/foo .
$ ls -l -G -g --inode
7476869 -rwxr-xr-x. 1 29545 Aug 2 07:28 foo
$ trash example/foo
ここでは、ファイルは新しいiノードにコピーされましたが、その mtime 変わらなかった。ただし、権限はインストールに設定されていました デフォルトの755 。
インストールを使用できます ファイルの権限、所有者、およびグループを設定するには:
$ install --preserve-timestamp \
--owner=skenlon \
--group=dialout \
--mode=666 example/foo .
$ ls -li
7476869 -rw-rw-rw-. 1 skenlon dialout 29545 Aug 2 07:28 foo
$ trash example/foo
移動、コピー、削除
ファイルにはデータが含まれ、非常に重要なファイルにはあなたのが含まれます データ。それらを賢く管理することを学ぶことは重要です、そして今あなたはあなたのデータがあなたが望むように正確に扱われることを確実にするためのツールキットを持っています。
データを管理する別の方法はありますか?コメントであなたのアイデアを教えてください。