このコマンド( `tar`)は実際に何をしますか?もっと良い方法がありますか?

このコマンド( `tar`)は実際に何をしますか?もっと良い方法がありますか?

配布リポジトリの作成に関するいくつかのドキュメントを見ています。ただし、次のコマンドの機能を正確に理解することはできません。

# cd /mnt/
# ls
centos-1  centos-2  centos-3
# for i in 1 2 3 
> do
> cd /mnt/centos-$i
> tar cpf - . | ( cd /var/ftp/ks/centos/; tar xpf - )
> done

/mnt/centos-<index>私の(明らかに間違った)要約は、マウントされた各CD()を繰り返してtar権限を保持するフォルダを作成することです。次に、tar権限を維持しながらファイルを別のフォルダに再抽出します。

それでは、なぜこれが起こるのですか?本当に良い方法はありませんか?あるいは、アイデア全体が欠けている可能性があります。

答え1

この手順でcpの代わりにtar(またはcpio)を使用することをお勧めするのは、これらのツールがどのように機能するかです。

cp は各ファイルオブジェクトに対して順番に動作し、ディスクからそのオブジェクトを読み取り、新しい場所に書き込みます。ソースとターゲットの場所がディスクに近づかない可能性があるため、場所間で多くの検索が発生する可能性があります。

tarとcpioはできるだけ多くの内容を一度に読み、アーカイブに書き込みます。これは、ソースファイルを順番に読み込み、ターゲットファイルを順番に作成し(もちろんプロセス切り替えを許可する)、ルックアップ回数を減らし、時間を節約することを意味します。

答え2

このコマンドは、ディレクトリサブツリー(つまり、tarが権限、所有権、リンクなどを保存する場所)の正確なアーカイブに似たコピーを作成します。

まず、命令です

tar cpf - . | ( cd /var/ftp/ks/centos/; tar xpf - )

等しい

tar cpf - . | tar -C /var/ftp/ks/centos -x -p -f -

-Cファイルの抽出を開始する前にtarが変更する必要がある作業ディレクトリを指定します。

おそらく、同僚がこのオプションを認識していない可能性があります-C

均等に:

cp -a * /var/ftp/ks/centos/

(ここで、-r --preserve=all --no-dereference --preserve=links を-a意味--archiveします。つまり、cp は、正確なアーカイブと同様のコピーを実行するときに予想されるように、権限、再帰コピーなどを保持します)

*シェルパターンの一致は、現在の作業ディレクトリのドットファイルをキャプチャしないため、同じではありません。さまざまなソースモードの場合、POSIXではなくGNU拡張をtar選択した理由cp -aは、ソリューションの移植性が高いためです。cp -atar

tarcpを選択するにはパフォーマンス上の理由はありません。

関連情報