フォルダーをマージし、CLIを使用してファイルを置き換える


9

一部のフォーラムソフトウェアを更新したいのですが、学習の可能性としてCLIを使用してアップグレードプロセスをテストしたいと思います。

フォルダーの内容を別のフォルダーにマージしてファイルを置き換えるにはどうすればよいですか?

回答:


10

rsyncこれを行うために使用できます:

$ rsync -abviuzP src/ dest/
  • -aアーカイブモード。-rlptgoDと等しい(-H、-A、-Xなし)
  • -i デフォルトのフォーマットよりも多くの情報を表示する、項目別フォーマットをオンにします
  • -b両方のフォルダに存在するrsyncバックアップファイルを作成し、古いファイルに〜を追加します。このサフィックスは--suffix .sufで制御できます
  • -u srcよりもdestで新しいrsync転送スキップファイルを作成します
  • -z 圧縮をオンにします。これは、低速リンクを介して簡単に圧縮できるファイルを転送するときに役立ちます。
  • -P --partialおよび--progressをオンにします
    • --partial 転送が中断された場合、rsyncは部分的に転送されたファイルを保持します
    • --progress 転送ごとに進行状況バーを表示します。大きなファイルを転送する場合に役立ちます

これらのスイッチのいくつかをドロップしますが、これはあなたが始めるためのものです。私はおそらく次のようなものを使用するでしょう:

$ rsync -abuP src/ dest/

OKになったら、次のコマンドを実行してバックアップファイルを削除できます。

$ find dest/ -name "*.~" -delete

次のサンプルデータがあるとします。

元のデータ

次のコマンドを使用して、偽のデータを作成します。

$ seq 10 | xargs -I{} -- mkdir dest/dir{}
$ for i in $(seq 5); do echo "$i" > dest/dir$i/file$i;done

偽のデータは次のようになります。

$ tree -DsifvF --noreport dest/
dest
[       4096 Aug 29 22:21]  dest/dir1/
[          2 Aug 29 22:21]  dest/dir1/file1
[       4096 Aug 29 22:21]  dest/dir2/
[          2 Aug 29 22:21]  dest/dir2/file2
[       4096 Aug 29 22:21]  dest/dir3/
[          2 Aug 29 22:21]  dest/dir3/file3
[       4096 Aug 29 22:21]  dest/dir4/
[          2 Aug 29 22:21]  dest/dir4/file4
[       4096 Aug 29 22:21]  dest/dir5/
[          2 Aug 29 22:21]  dest/dir5/file5

新しいデータ

ここで、元のデータ(dest/*-> src/)を複製し、いくつかの新しいファイルをミックスに追加します。これは「新しいリリースをシミュレートします。

$ cp -pr dest/* src/
$ mkdir src/dir11
$ for i in 1 3 5 11; do echo "$i$i" > src/dir$i/file$i;done

偽のデータは次のようになります。

$ tree -DsifvF --noreport src/
src
[       4096 Aug 29 22:21]  src/dir1/
[          3 Aug 29 23:00]  src/dir1/file1
[       4096 Aug 29 22:21]  src/dir2/
[          2 Aug 29 22:21]  src/dir2/file2
[       4096 Aug 29 22:21]  src/dir3/
[          3 Aug 29 23:00]  src/dir3/file3
[       4096 Aug 29 22:21]  src/dir4/
[          2 Aug 29 22:21]  src/dir4/file4
[       4096 Aug 29 22:21]  src/dir5/
[          3 Aug 29 23:00]  src/dir5/file5
[       4096 Aug 29 23:00]  src/dir11/
[          5 Aug 29 23:00]  src/dir11/file11

src /をdest /にマージ

これは、新しいソフトウェアツリーをセットアップし、src/既存のディレクトリにマージすることを模倣していますdest/

$ rsync -abuP src/ dest/
sending incremental file list
dir1/file1
           3 100%    0.00kB/s    0:00:00 (xfer#1, to-check=5/13)
dir11/
dir11/file11
           5 100%    4.88kB/s    0:00:00 (xfer#2, to-check=4/13)
dir3/file3
           3 100%    2.93kB/s    0:00:00 (xfer#3, to-check=2/13)
dir5/file5
           3 100%    2.93kB/s    0:00:00 (xfer#4, to-check=0/13)

sent 416 bytes  received 97 bytes  1026.00 bytes/sec
total size is 18  speedup is 0.04

ご覧のとおり、file1、file3、file5、および新しく追加されたdir11 + file11のファイルが更新されました。

確認として、次のバックアップファイルがでrsync既存のファイルに遭遇したときに作成されたことがわかりますdest/

$ find dest/ | grep "~"
dest/dir3/file3~
dest/dir1/file1~
dest/dir5/file5~

上記の点を明確にするには、問題がなければ、次のコマンドを実行してバックアップファイルを削除します。> $ find dest / -name "start dot〜" -deleteこれは私には機能しなかったようですが、> $ dest / -name "start dot star〜" -deleteを見つけました。それがタイプミスなのか、何か私の設定が正しくないのかわかりません!

2

cp -r name_of_the_folder / * name_of_the_destination_folderを使用できます。アスタリスク(*)はすべてのファイルを表し、-rは再帰的なコピーを表します。

内容を上書きするかどうかを尋ねる-iオプションも使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.